Overflowers:我们有一个复杂的 Dock 小部件,其中包含几个复杂的聚合 QWidget。
我需要允许用户将停靠小部件最小化为功能区(作为 QToolBar),其中仅包含最重要的小部件。但是因为这些小部件相当复杂,我宁愿不在代码中重现它们,并且煞费苦心地来回传输它们的自定义值。单击小部件的一个副本的行为应该与单击另一个完全相同。
因此,我似乎想发明一个 QDoppelganger 小部件,它来回委托输入和呈现事件,以制作另一个控件的功能副本:
class QDoppelganger(QtGui.QWidget):
def __init__(self, dupeMe, parent):
super(QDoppelganger, self).__init__(parent)
self.dupeMe = dupeMe
formerResizer = self.dupeMe.resizeEvent
def resizeMe(qResizeEvent):
self.setFixedSize(self.dupeMe.size())
return formerResizer(qResizeEvent)
self.dupeMe.resizeEvent = resizeMe
formerPainter = self.dupeMe.paintEvent
def paintMe(qPaintEvent):
self.update()
return formerPainter(qPaintEvent)
self.dupeMe.paintEvent = paintMe
def mouseMoveEvent(self, qMouseEvent): return self.dupeMe.mouseMoveEvent(qMouseEvent)
def mousePressEvent(self, qMouseEvent): return self.dupeMe.mousePressEvent(qMouseEvent)
def mouseReleaseEvent(self, qMouseEvent): return self.dupeMe.mouseReleaseEvent(qMouseEvent)
def paintEvent(self, qPaintEvent):
pix = QtGui.QPixmap(self.dupeMe.width(), self.dupeMe.height())
painter = QtGui.QPainter()
painter.begin(pix)
self.dupeMe.render(painter)
painter.end()
qp = QtGui.QPainter()
qp.begin(self)
qp.drawImage(0, 0, pix.toImage())
qp.end()
它的驱动代码很简单:
button = QtGui.QPushButton('dupe me')
doppel = QtUtil.QDoppelganger(button, None)
将一个小部件粘贴到停靠小部件中,将另一个小部件粘贴到 QToolBar 中,我们就完成了。
如果我已经确定了,那么这篇文章是一个有用的片段。
如果没有,我可以要求审查这些技术吗?不管我写了多少行 PyQt 代码,似乎总是有人用一些“cleverSignal.connect(cleverSlot)”来简单地用更少的代码行将东西连接在一起。具体来说,不是将一个控件渲染到 QPixmap 中,然后将其绘制到 doppelganger 控件中,我不能简单地直接连接绘制事件吗?