类似于向导的用户界面,带有下一个和上一个按钮

Ped*_*iro 2 python pyqt pyqt4

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

https://files.support.epson.com/htmldocs/pho825/pho825f1/images/2knhw1.gif

如果用户不清楚,则在当前屏幕关闭并在用户单击下一步时打开以下屏幕,或者在用户单击后单击时打开以下屏幕,屏幕关闭并打开前一个屏幕,我仅以下一个按钮为例进行了示例,并返回示例:

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_()
Run Code Online (Sandbox Code Playgroud)

简而言之:如何实现一个功能,该功能可调用另一个屏幕并单击按钮来关闭当前屏幕?

Tri*_*ion 5

首先是一个误解:您通常不创建/不显示一个屏幕(窗口),而是关闭另一个屏幕,通常仅在按按钮之类的操作时交换类似于向导的对话框窗口的内容。该窗口一直处于活动状态,直到完成多页任务为止。

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

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

由于您仍然可以使用PyQt4尚不具备的方法QLayout.replaceWidget,因此最好只使用removeWidgetaddWidget的方法,QLayout并且由于addWidget在布局项列表的末尾添加了小部件,因此我更喜欢为向导的可互换内容使用专用布局(另请参见:如何将Item添加到布局中的特定索引)。

使用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_()
Run Code Online (Sandbox Code Playgroud)

它看起来像:

在此处输入图片说明

但是,正如Marius在评论中所写,使用QWizard在Qt中对此类对话框有相当广泛的支持。因此,我强烈建议改用它。上面的示例仅用于演示在布局中插入和删除小部件的功能。

您绝对应该使用QWizard解决此类问题!