【发布时间】:2012-02-15 20:48:06
【问题描述】:
我想在小部件调整大小时采取行动。
有没有办法在没有在该小部件上安装事件过滤器的情况下捕获它(显然,没有子类化它)? AFAIK,QWidget 没有resized 信号。
【问题讨论】:
-
不,你不能。 bset 方法是:创建你自己的 QWidget,它在 resizeEvent() 中发出 Resized,然后将你的小部件提升到它:)
我想在小部件调整大小时采取行动。
有没有办法在没有在该小部件上安装事件过滤器的情况下捕获它(显然,没有子类化它)? AFAIK,QWidget 没有resized 信号。
【问题讨论】:
您可以从widget 类派生并重新实现resizeEvent 事件
【讨论】:
如果您有任何其他可以与该 QWidget 有严格关系的 QObject,您可以使用 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_())
【讨论】:
对不起,它看起来像一个 hack,但我用这个:
some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)
【讨论】:
这已经晚了几年,但我正在开发一个可以完全覆盖父级的透明覆盖小部件。没有子类化你不能做你想做的事,但是你可以像@reclosedev 建议的那样将子类化限制为一个实例,这意味着你不必实际创建一个子类。
我编写了以下 sn-p(在 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 instance,这意味着您不必创建实际的子类。借助附加的方法,每个父实例都将有效地成为子类的实例。如果您需要一次性的东西,所有用于删除子类resizeEvent 方法并将其替换为原始方法的代码都可以丢弃。在这种情况下,该解决方案基本上是 @reclosedev 解决方案的更高级版本,但 @Chris 的 cmets 关于保留原始地址。
此代码的唯一警告是它不能正确支持 GL 小部件,因此例如不能始终将叠加层添加到 QGraphicsView 的视口中。但是,它可以添加到 QGraphicsView 本身。
【讨论】:
您可以通过
覆盖resizeEvent
def resizeEvent(self, newSize):
#do code here
【讨论】: