我希望在调整窗口小部件时采取措施。
有没有办法在没有在该窗口小部件上安装事件过滤器的情况下捕获它(显然,没有子类化它)? AFAIK,QWidget没有resized
信号。
答案 0 :(得分:21)
您可以从widget
类派生并重新实现resizeEvent
事件
答案 1 :(得分:11)
如果你有任何其他QObject可以与该QWidget有严格的关系,你可以使用QObject::installEventFilter(QObject * filter)
并重载bool eventFilter(QObject *, QEvent *)
。请点击Qt docs
答案 2 :(得分:9)
如果您使用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_())
答案 3 :(得分:4)
抱歉,它看起来像是黑客,但我用它:
some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)
答案 4 :(得分:2)
这已经太晚了几年,但我正在开发一个完全覆盖父级的透明覆盖小部件。如果没有子类化,你就无法做你想做的事,但你可以像@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
实例的子类,这意味着您不必创建实际的子类。借助于on on方法,每个父实例将有效地成为子类的实例。如果您需要一次性的东西,删除子类resizeEvent
方法并将其替换为原始方法的所有代码都可以被删除。在这种情况下,该解决方案基本上是@ reclosedev解决方案的更高版本,但有@Chris关于保留原始地址的评论。
此代码唯一需要注意的是它不能正确支持GL小部件,因此例如,无法始终将叠加层添加到QGraphicsView
的视口中。但是,它可以添加到QGraphicsView
本身。
答案 5 :(得分:2)
您可以通过
覆盖resizeEvent
def resizeEvent(self, newSize):
#do code here