Overflowers:我们有一个复杂的Dock小部件,里面有几个复杂的聚合QWidgets。
我需要允许用户将停靠窗口小部件最小化到功能区(作为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控件中,我不能直接连接paint事件吗?