Подтвердить что ты не робот

QWidget изменить размер сигнала?

Я хочу выполнить действие, когда виджет был изменен.

Есть ли способ поймать это, не устанавливая фильтр событий для этого виджета (и, очевидно, без его подклассификации)? AFAIK, QWidget не имеет сигнала resized.

4b9b3361

Ответ 1

Если у вас есть другой QObject, который может иметь строгое отношение к этому QWidget, вы можете использовать QObject::installEventFilter(QObject * filter) и перегружать bool eventFilter(QObject *, QEvent *). Подробнее см. Qt docs

Ответ 2

Вы можете получить из класса widget и переопределить resizeEvent событие

Ответ 3

Если вы используете Python с PyQt4, вы можете установить widget.resizeEvent в свою функцию без его подсекции:

#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui

def onResize(event):
    print event

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    widget = QtGui.QPushButton('Test')
    widget.resizeEvent = onResize
    widget.resize(640, 480)
    widget.show()
    sys.exit(app.exec_())

Ответ 4

Извините, это похоже на взлом, но я использую это:

    some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)

Ответ 5

Это уже через пару лет, но я работал над прозрачным оверлейным виджэтом, который полностью покрывал бы родителя. Вы не можете делать то, что хотите, без подкласса, но вы можете ограничить подклассу экземпляру, как предлагает @reclosedev, что означает, что вам не нужно создавать подкласс.

Я написал следующий фрагмент (который работает в PyQt4), чтобы следить за размером любого виджета, который добавлен виджет:

class TransparentOverlay(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
        self._updateParent(self.parentWidget())

    def setParent(self, parent, *args):
        prevParent = self.parentWidget()
        super().setParent(parent, *args)
        self._updateParent(parent, prevParent)

    def unsetParent(self, parent=None):
        if parent is None:
            parent = self.parentWidget()
        if parent is not None and hasattr(parent.resizeEvent, '_original'):
            parent.resizeEvent = parent.resizeEvent._original

    def _updateParent(self, parent, prevParent=None):
        if parent is not prevParent:
            self.unsetParent(prevParent)
            if parent is not None:
                original = parent.resizeEvent
                def resizeEventWrapper(event):
                    original(event)
                    self.resize(event.size())
                resizeEventWrapper._original = original
                parent.resizeEvent = resizeEventWrapper
                self.resize(parent.size())

Этот код использует пару опрятных трюков, которые возможны с Python:

  • Исходный метод заключен в атрибут _original нового. Это возможно, потому что функции являются объектами.
  • Новый метод действительно подклассифицирует любой экземпляр QWidget, что означает, что вам не нужно создавать фактический подкласс. Каждый родительский экземпляр будет фактически стать экземпляром подкласса в соответствии с методом привязки.

Если вам нужна единовременная вещь, весь код для удаления подкласса resizeEvent и замена его оригиналом может быть поврежден. В этом случае решение в основном является более удобной версией решения @reclosedev, но с комментариями @Chris о сохранении исходного адреса.

Единственное предостережение с этим кодом заключается в том, что он не поддерживает GL-виджеты правильно, поэтому, например, оверлей не всегда можно добавить в окно просмотра QGraphicsView. Его можно, однако, добавить к самому QGraphicsView.

Ответ 6

Вы можете переопределить resizeEvent на

def resizeEvent(self, newSize):
    #do code here