2

カスタム ウィジェットを使用してインターフェイスを構築しようとしていますが、次の問題が発生しました。

Rectangleインターフェイスでインタラクティブな要素として使用したいウィジェットがあります。四角形を定義するには、親を指定するだけでよいので、描画するウィンドウと、[x,y, width, height]その位置とサイズを定義する位置を知ることができます。(「絶対配置ではなくレイアウトを使用する必要がある」と言う人もいると思いますが、この特定のアプリケーションには絶対配置が必要であると 100% 確信しています)。

from PySide.QtCore import *
from PySide.QtGui import *
import sys

class Rectangle(QWidget):

    def __init__(self, parent, *args):
        super(self.__class__,self).__init__(parent)

        print parent, args
        #expect args[0] is a list in the form [x,y,width,height]
        self.setGeometry(*args[0])

    def enterEvent(self, e):
        print 'Enter'

    def leaveEvent(self, e):
        print 'Leave'

    def paintEvent(self, e):

        print 'Painted: ',self.pos
        painter = QPainter(self)
        painter.setPen(Qt.NoPen)
        painter.setBrush(QColor(200,100,100))
        painter.drawRect(0,0,self.width()-1, self.height()-1)
        painter.end()

またWindow、ビジュアライゼーションが描画されるキャンバスであるウィジェットもあります。の定義では、20,40 に長方形 A を作成Windowます__init__()

class Window(QWidget):

    def __init__(self):
        super(self.__class__, self).__init__()


        self.widgets = [Rectangle(self,[20,40,100,80])]
        self.setMouseTracking(True)
        self.setGeometry(300,300,800,600)
        self.setWindowTitle('Window')
        self.show()

    def addWidget(self,Widget, *args):
        self.widgets += [Widget(self, *args)]
        self.update()

    def mousePressEvent(self, e):
        for widget in self.widgets:
            print widget.geometry()

私はビジュアライゼーションを構築しているWindowので、後でウィジェットを作成して追加したいので、インスタンスを作成しますmWindow。これには、既に四角形 Aが定義されているはずです。次に、ウィンドウのメソッドを使用して 200,200 に 2 番目の四角形を追加します。これを四角形 BaddWidget()と呼びます。

if __name__ == "__main__":
    app= QApplication(sys.argv)

    mWindow = Window()
    mWindow.addWidget(Rectangle, [200,200,200,80])
    sys.exit(app.exec_())

私が抱えている問題は、長方形 Aのみが実際に描画されることです。

コンストラクターの の出力により、長方形 A と **長方形 B の両方がインスタンス化され、両方がmyWindow親ウィジェットとして存在することがわかっています。print parentRectangle

ただし、ウィンドウのサイズを変更して強制的に再描画させると、メソッドは四角形 Bではなく四角形ApaintEvent()でのみ呼び出されます。私は何が欠けていますか?

4

1 に答える 1