QDoppelganger(将QWidget克隆到另一个容器中)

时间:2013-05-28 03:53:23

标签: pyqt4 qwidget

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事件吗?

0 个答案:

没有答案