我正在使用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_()
Run Code Online (Sandbox Code Playgroud)
简而言之:如何实现一个功能,该功能可调用另一个屏幕并单击按钮来关闭当前屏幕?
首先是一个误解:您通常不创建/不显示一个屏幕(窗口),而是关闭另一个屏幕,通常仅在按按钮之类的操作时交换类似于向导的对话框窗口的内容。该窗口一直处于活动状态,直到完成多页任务为止。
所以我认为您的问题实际上是关于:
如何交换布局中的小部件?
由于您仍然可以使用PyQt4尚不具备的方法QLayout.replaceWidget,因此最好只使用removeWidget和addWidget的方法,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解决此类问题!
| 归档时间: |
|
| 查看次数: |
2611 次 |
| 最近记录: |