0

マルチウィンドウ GUI を作成する必要があります。最初に QWidgets で試してみましたが、最終的に使用する必要がある QStackWidget ツールを発見しました。だから私はしようとしていますが、私はいくつかの問題を抱えています。御時間ありがとうございます。

class MainWindow(QMainWindow):

    def __init__(self):

        super(MainWindow,self).__init__()

        self.mainWidget = MainWidget()
        self.searchWidget = SearchWidget()
        self.sWidget = QStackedWidget()
        self.sWidget.addWidget(self.mainWidget)
        self.sWidget.addWidget(self.searchWidget)

        self.initUI() 

sub_widget クラスから setCurrentWidget を呼び出します。

class MainWidget(QWidget):

    def __init__(self, parent=MainWindow):

        super(MainWidget,self).__init__()
        self.initUI()

    def initUI(self):

        searchButton = QPushButton('searchButton',self)
        optionButton = QPushButton('optionButton',self)
        quitButton = QPushButton('quitButton',self)
        listButton = QPushButton('listButton',self)

        searchButton.clicked.connect(self.goSearch)

        hbox = QHBoxLayout()
        hbox.addWidget(listButton)
        hbox.addWidget(quitButton)

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(searchButton)
        vbox.addWidget(optionButton)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

    def goSearch(self):
        self.parent().sWidget.setCurrentWidget(self.parent().searchWidget)

IDE から次のメッセージを受け取りました。

  self.parent().sWidget.setCurrentWidget(self.parent().searchWidget)
  AttributeError: 'PySide.QtGui.QStackedWidget' object has no attribute 'sWidget'

私が間違っていることは何ですか?

4

2 に答える 2

0

ここに投稿したコードについてコメントします: http://pastebin.com/fBfS1X5m

知っておくべき重要なことは、ウィジェットなどをウィジェット内に配置できることです。例えば:

class Widget(QWidget):
    def __init__(self, parent=None):
        layout = QVBoxLayout(self)
        childWidget = QWidget(parent=self)
        layout.addWidget(childWidget)

簡単なメモ: docsを介してメイン レイアウト コンストラクターにsetLayout渡す場合は必要ありません。self

とにかく、ここで説明しようとしているのは、QStackedWidgetと はSearchWidget実際には の一部であってはならず、ページMainWindow間の切り替えを処理する独自の関連ウィジェット内に存在する必要があるということです。QStackedWidget

たとえば、次のMainWindow.__init__ようになります。

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.mainWidget = MainWidget(self)
        self.setCentralWidget(self.mainWidget)

        self.initUI()

次にMainWidget、次のようになります。

class MainWidget(QtGui.QWidget):
    ...

    def initUI(self):
        ...

        self.stack = QtGui.QStackedWidget(parent=self)

        self.searchWidget = SearchWidget(parent=self)
        self.searchWidget.searchButton.clicked.connect(self.goSearch)
        self.backWidget = BackWidget(parent=self)
        self.backWidget.backButton.clicked.connect(self.goBack)

        ...

    def goSearch(self):
        self.stack.setCurrentWidget(self.backWidget)

    def goBack(self):
        self.stack.setCurrentWidget(self.searchWidget)

いくつかのクラス名をもう少し意味のある名前に変更しました (少なくとも私にとっては)。SearchWidgetはあなたの古いものMainWidgetでした。BackWidgetはあなたの古いものSearchWidgetでした。これらの変更SearchWidgetに従うと、1 つの例外を除いて古いものと同じように見えます。MainWidget検索ボタンへの参照を保存して、MainWidget上記のようにクラスでアクセスできるようにします (それらの信号をスロットに接続するとき)。のボタンについても同じことを行いますBackWidget

名前が変更された 2 つの「子」ウィ​​ジェット:

class SearchWidget(QtGui.QWidget):
    ...

    def initUI(self):
        self.searchButton = QtGui.QPushButton('searchButton', parent=self)
        optionButton = QtGui.QPushButton('optionButton', parent=self)
        quitButton = QtGui.QPushButton('quitButton', parent=self)
        listButton = QtGui.QPushButton('listButton', parent=self)

        vbox = QtGui.QVBoxLayout(self)
        vbox.addStretch(1)
        vbox.addWidget(self.searchButton)
        vbox.addWidget(optionButton)

        hbox = QtGui.QHBoxLayout()
        hbox.addWidget(listButton)
        hbox.addWidget(quitButton)

        vbox.addLayout(hbox)

class BackWidget(QtGui.QWidget):
    ...

    def initUI(self):
        self.backButton = QtGui.QPushButton('GoBack', parent=self)

したがって、次のようなものがあります。

MainWindow  
   |---MainWidget  
          |---QStackedWidget  
                 |---SearchWidget  
                 |---BackWidget  

完全な作業コードはこちらにあります

于 2014-11-06T04:41:26.523 に答える
0

この行:

    def __init__(self, parent=MainWindow):

インスタンスが実際に必要な場合、MainWindow クラスをデフォルトの引数として設定します。しかし、それがインスタンスだったとしても、次の行では、それを基底クラスに渡すことにも失敗しています。

    super(MainWidget,self).__init__()

代わりに行う必要があるのは、次のようなものです。

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow,self).__init__()
        # pass an instance of MainWindow here
        self.mainWidget = MainWidget(self)
        ...

class MainWidget(QWidget):
    def __init__(self, parent):
        # pass the parent to the base-class
        super(MainWidget, self).__init__(parent)
        ...

更新

stack-widget は、追加されたすべてのウィジェットを再親化して、親なります。これを回避する方法はありますが、コードの本当の問題は、構造が逆になっていることだと思います。現在のウィジェットを設定するボタンはメイン ウィンドウによって制御され、スタック内のウィジェットはそれとは完全に独立して動作する必要があります。

于 2014-10-30T18:14:01.090 に答える