0

I need to create multi-window GUI, first I tried it with QWidgets, but finally I discover QStackWidget tool I need to use. So Im trying to, but Ive got some problems. Thanks for Your time.

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() 

and calling setCurrentWidget from the sub_widget class:

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)

Ive got this message from IDE:

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

What is the thing Im doing wrong?

4

2 回答 2

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 回答
0

我将评论您在此处发布的代码:http: //pastebin.com/fBfS1X5m

要知道的重要一点是,您可以将小部件放在小部件中,等等。例如:

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

setLayout只是一个简短的说明:如果您通过docsself传递给主布局构造函数,则不需要。

无论如何,我在这里试图说明的是,QStackedWidgetSearchWidget真的不应该是 的一部分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是你的老MainWidgetBackWidget是你的老SearchWidget。进行这些更改后,您的更改SearchWidget将与您的旧版本相同,MainWidget但有一个例外 - 我们保存了对搜索按钮的引用,以便我们可以在MainWidget上面看到的类中访问它(当我们将它们的信号连接到我们的插槽时)。我们对 中的按钮做同样的事情BackWidget

两个重命名的“子”小部件:

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 回答