6 ответов:
Если у вас есть какой-либо другой QObject, который может иметь строгое отношение к этому QWidget, вы можете использовать
QObject::installEventFilter(QObject * filter)и перегрузкуbool eventFilter(QObject *, QEvent *). Подробнее см. в Qt docs
В случае, если вы используете 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.Если вам нужна одноразовая вещь, весь код для удаления подклассный метод
Единственным недостатком этого кода является то, что он неправильно поддерживает виджеты GL, поэтому, например, наложение не всегда может быть добавлено в окно просмотраresizeEventи замена его на исходный могут быть уничтожены. В этом случае решение в основном является более причудливой версией решения @reclosedev, но с комментариями @Chris о сохранении исходного адреса.QGraphicsView. Однако он может быть добавлен к самомуQGraphicsView.
Comments