6

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 控件中,我不能简单地直接连接绘制事件吗?

4

0 回答 0