PySide多窗口,让QStackWidget开始工作



我需要创建多窗口GUI,首先我用QWidget尝试了它,但最后我发现了我需要使用的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'

我做错了什么?

我将对您在这里发布的代码发表评论:http://pastebin.com/fBfS1X5m

需要知道的一件重要的事情是,你可以把小部件放在小部件中,等等

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

简单说明一下:如果通过文档将self传递给主布局构造函数,则不需要setLayout

无论如何,我在这里试图说明的是,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  

你可以在这里找到完整的工作代码。

此行:

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

更新

堆栈小部件将重新为添加到其中的任何小部件设置父级,以便成为父级。有很多方法可以解决这个问题,但我认为代码的真正问题是结构向后。设置当前小部件的按钮应该由主窗口控制,堆栈中的小部件应该完全独立于主窗口工作。

相关内容

  • 没有找到相关文章

最新更新