6

オーバーフロー: いくつかの複雑な集約 QWidgets を含む複雑なドック ウィジェットがあります。

ユーザーが最も重要なウィジェットのみを含むドック ウィジェットを (QToolBar として) リボンまで最小化できるようにする必要があります。しかし、これらのウィジェットはかなり複雑なので、コードで再現したり、苦労してカスタム値をやり取りしたりしたくはありません。ウィジェットの 1 つのコピーをクリックすると、別のコピーをクリックした場合とまったく同じように動作する必要があります。

そのため、別のコントロールの機能するコピーを作成するために、入力イベントとレンダリング イベントを前後にデリゲートする 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)

1 つのウィジェットをドック ウィジェットに貼り付け、別のウィジェットを QToolBar に貼り付ければ、完了です。

私がそれを釘付けにした場合、この投稿は便利なスニペットです.

そうでない場合は、テクニックの見直しをリクエストできますか? 私が書いた PyQt コードの行数に関係なく、誰かが常に「cleverSignal.connect(cleverSlot)」を使用して、さらに少ない行数のコードで単純に接続しているようです。具体的には、1 つのコントロールを QPixmap にレンダリングしてから、それをドッペルゲンガー コントロールにペイントする代わりに、ペイント イベントを直接接続することはできませんか?

4

0 に答える 0