2

作業してテストした pyqt4 でカスタム ウィジェットを作成し、メイン ウィンドウにロードする準備ができました。デザイナーに表示されないため、メイン ウィンドウに手動で追加する必要があります。

私のウィジェットは、py ファイルに変換する代わりに uic を使用して ui ファイルをロードします (これまでのところ、手間がかかりません)。したがって、次のようになります。

class widgetWindow(QtGui.QWidget):
    def __init__(self, parent = None):
        super(widgetWindow, self).__init__(parent)
        self.ui = uic.loadUi("widget.ui")
    #everything else

メインクラス(簡潔にするための例)で、レイアウトを作成し、ウィジェットをレイアウトに追加してから、メインウィジェットに追加します

class main(QtGui.QMainWindow):
    def __init__(self, parent = None):
        super(main, self).__init__(parent)
        self.ui = uic.loadUi("testWindow.ui")
        mainlayout  = QtGui.QVBoxLayout()
        window = widgetWindow(self)
        mainlayout.addWidget(window)
        centerWidget = QtGui.QWidget()
        centerWidget.setLayout(mainlayout)
        self.ui.setCentralWidget(centerWidget)

エラーはスローされず、ウィジェット用のスペースが作成されますが、何も表示されません。

行 window.ui.show() を追加すると、メインウィンドウで占有する必要があるスペースの上に新しいウィンドウがポップアップ表示されます。私は何が欠けていますか?

4

3 に答える 3

2

uic ローダーをさらに調査すると、ui ファイルをロードする方法が 2 つあります。質問で使用している方法は 1 つの方法であり、もう 1 つの方法は uic.loadUiType() を使用する方法です。これにより、QtGui.QWidget クラス オブジェクトだけでなく、クラス オブジェクトによって継承される基本クラスとフォーム クラスの両方が作成されます。

widgetForm, baseClass= uic.loadUiType("addTilesWidget.ui")

class windowTest(baseClass, widgetForm):
    def __init__(self, parent = None):
        super(windowTest, self).__init__(parent)
        self.setupUi(self)

このようにして、ウィジェットを期待どおりに別のフォームにロードできます。正確な理由については、私はまだその答えを見つけていません。

さまざまなセットアップ タイプに関する詳細情報: http://bitesofcode.blogspot.com/2011/10/comparison-of-loading-techniques.html

于 2012-05-16T18:30:02.970 に答える
0

'centerWidget'がメインウィンドウの中央ウィジェットであることを指定する必要があります。つまり、クラスmainのコードには、次のような行が必要です 。self.setCentralWidget(centerWidget)

class main(QMainWindow):
    def __init__(self, parent = None):            
        super(main, self).__init__(parent)
        ....
        self.setCentralWidget(centerWidget)

于 2012-05-16T07:14:45.033 に答える
0

親引数を loadUi ステートメントに追加してみてください。

    self.ui = uic.loadUi("widget.ui",parent)
    self.ui = uic.loadUi("testWindow.ui",self)

メインクラスの最後で次の行を試してください。

    self.setCentralWidget(centerWidget)
于 2012-05-16T07:11:17.597 に答える