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



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

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

172   6  

6 ответов:

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

Можно вывести из widget класса и переопределить resizeEvent Событие

В случае, если вы используете 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_())

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

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

Это на пару лет опоздало, но я работал над прозрачным виджетом наложения, который полностью закрывал бы родительский элемент. Вы не можете делать то, что хотите, без подклассов, но вы можете ограничить подкласс экземпляром, как предлагает @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 экземпляр , что означает, что вам не нужно создавать фактический подкласс. Каждый родительский экземпляр будет эффективно становиться экземпляром подкласса в силу метода tacked on.

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

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

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

def resizeEvent(self, newSize):
    #do code here
    Ничего не найдено.

Добавить ответ:
Отменить.