Python 具有“下一步”和“上一步”按钮的向导式用户界面

Python 具有“下一步”和“上一步”按钮的向导式用户界面,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我正在使用Qt Designer和PyQt4开发一个应用程序,我需要制作几个屏幕,每个屏幕捕获用户特定的数据,为此我需要实现一个下一步按钮和一个后退按钮,类似于 当用户单击“下一步”时,当前屏幕关闭,以下内容打开;如果用户单击“上一步”,则屏幕关闭并打开上一个屏幕。如果我不清楚,我仅使用“下一步”按钮和“上一步”按钮进行示例: from PyQt4.QtGui import * from PyQt4.QtCore import * class Frm(QWidget): def __

我正在使用Qt Designer和PyQt4开发一个应用程序,我需要制作几个屏幕,每个屏幕捕获用户特定的数据,为此我需要实现一个下一步按钮和一个后退按钮,类似于

当用户单击“下一步”时,当前屏幕关闭,以下内容打开;如果用户单击“上一步”,则屏幕关闭并打开上一个屏幕。如果我不清楚,我仅使用“下一步”按钮和“上一步”按钮进行示例:

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Frm(QWidget):
    def __init__(self, parent = None):
        super(Frm, self).__init__(parent)

        next = QPushButton('Next >', self)
        back = QPushButton('< Back', self)

        hbox = QHBoxLayout()

        hbox.addWidget(back)
        hbox.addWidget(next)

        self.setLayout(hbox)

if __name__ == '__main__':
    import sys
    root = QApplication(sys.argv)
    app = Frm(None)
    app.show()
    root.exec_()
从PyQt4.QtGui导入*
从PyQt4.QtCore导入*
类别Frm(QWidget):
def uuu init uuu(self,parent=None):
超级(Frm,自我).\u初始\u(父级)
next=QPushButton('next>',self)
后退=QPushButton(“

简而言之:我如何实现一个调用另一个屏幕并在单击按钮时关闭当前屏幕的功能?

首先,关于一个误解:您通常不会创建/显示一个屏幕(窗口)并关闭另一个屏幕(窗口),您通常只会在按下按钮等操作时交换类似向导的对话框窗口的内容。在多页任务完成之前,窗口始终处于活动状态

所以我认为你的问题实际上是关于:

如何在布局中交换小部件?

由于您可能仍然使用PyQt4,而PyQt4尚未具有
QLayout.replaceWidget
,因此最好只使用
QLayout
removeWidget
addWidget
方法,并且由于
addWidget
将一个小部件添加到布局项列表的末尾,我更喜欢一个专门的布局,只用于向导的可互换内容(另请参见:)

示例代码使用PyQt5,但很容易转移到PyQt4。只执行“下一步”按钮

from PyQt5 import QtWidgets

class MyWizard(QtWidgets.QWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # vertical layout, wraps content layout and buttons layout
        vertical_layout = QtWidgets.QVBoxLayout()
        self.setLayout(vertical_layout)

        # content widget and layout
        self.content_layout = QtWidgets.QVBoxLayout() # could be almost any layout actually
        self.content = QtWidgets.QLabel('Page1') # customize with your content
        self.content_layout.addWidget(self.content)
        vertical_layout.addLayout(self.content_layout)

        # back, forward buttons wraped in horizontal layout
        button_layout = QtWidgets.QHBoxLayout()
        button_layout.addStretch()
        back_button = QtWidgets.QPushButton('Back')
        back_button.clicked.connect(self.back_button_clicked)
        button_layout.addWidget(back_button)
        forward_button = QtWidgets.QPushButton('Forward')
        forward_button.clicked.connect(self.forward_button_clicked)
        button_layout.addWidget(forward_button)
        vertical_layout.addLayout(button_layout)

    def back_button_clicked(self):
        """
        The back button is clicked.
        """
        pass

    def forward_button_clicked(self):
        """
        The forward button is clicked.
        """

        # remove old content
        self.content_layout.removeWidget(self.content)
        self.content.deleteLater()

        # create new content
        self.content = QtWidgets.QLabel('Another Page')

        # add new content
        self.content_layout.addWidget(self.content)

app = QtWidgets.QApplication([])

wizard = MyWizard()
wizard.setWindowTitle('MyWizard Example')
wizard.setFixedSize(600, 400)
wizard.show()

app.exec_()
它看起来像:

然而,正如在的评论中所写的那样,在Qt中使用这种对话框有相当广泛的支持。所以我强烈建议用它来代替。上面的示例只是为了演示在布局中插入和删除小部件的能力

对于此类问题,您绝对应该使用QWizard

有一个类允许您在Qt和PyQt中创建向导。它实现了您想要的所有功能,还有更多功能。您所要做的就是通过扩展来设计页面,并将它们添加到向导中。这比按照你的建议从头开始做整个事情要简单得多

旧问题,但缺少现有API的示例

您不需要自己创建向导的所有结构。Qt(和PyQt)已经提供了一个名为
QWizard
的类

基本示例:

wizard = QtWidgets.QWizard()
page1 = QtWidgets.QWizardPage()
page1.setTitle('Page 1 is best!')
page1.setSubTitle('1111111111')
lineEdit = QtWidgets.QLineEdit()
hLayout1 = QtWidgets.QHBoxLayout(page1)
hLayout1.addWidget(lineEdit)
wizard.addPage(page1)
完整的示例和一些解释:


如果您想使用
QWizard
,有一个很好的简单示例,您可以使用
setVisible
方法隐藏和显示某些小部件。