gpt4 book ai didi

python - 在 QMainWindows 中央小部件中的小部件之间切换

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:37 26 4
gpt4 key购买 nike

我有一个主窗口派生形式 QMainWindow,它可能会显示不同的小部件,具体取决于手头的任务。

我在下面创建了一个简化的示例:

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


class MainWindow(QMainWindow):

def __init__(self, parent=None):
'''
Constructor
'''
QMainWindow.__init__(self, parent)
self.central_widget = QStackedWidget()
self.setCentralWidget(self.central_widget)
self.start_screen = Start(self)
self.second_screen = Second(self)
self.central_widget.addWidget(self.start_screen)
self.central_widget.addWidget(self.second_screen)
self.central_widget.setCurrentWidget(self.start_screen)



class Start(QWidget):

def __init__(self, parent=None):
super(Start, self).__init__(parent)
layout = QHBoxLayout()
button = QPushButton(text=QString('Push me!'))
layout.addWidget(button)
self.setLayout(layout)
self.connect(button, SIGNAL("clicked()"), self.change_widget)

def change_widget(self):
self.parent().setCurrentWidget(
self.parent().parent().second_screen)


class Second(QWidget):

def __init__(self, parent=None):
super(Second, self).__init__(parent)
layout = QHBoxLayout()
button = QPushButton(text=QString('Back to Start!'))
layout.addWidget(button)
self.setLayout(layout)
self.connect(button, SIGNAL("clicked()"), self.change_widget)

def change_widget(self):
self.parent().setCurrentWidget(
self.parent().parent().start_screen)

app = QApplication(sys.argv)
myWindow = MainWindow(None)
myWindow.show()
app.exec_()

这会在两个不同的中央小部件之间切换,但是我发现使用 parent() 函数的处理很乏味,我想知道是否有更好的方法来组织小部件。

setCurrentWidget 方法可能总是可以通过一个 parent() 语句访问,但是如果由于任何原因层次结构深度发生变化,是否有更好的访问方法QMainWindow 比parent().parent()?或者我会在每次单击按钮时重新创建小部件(我假设,如果这是一个具有数据输入可能性的小部件,这些数据将会丢失,这很烦人)。

我感谢任何改进建议。

最佳答案

您应该使用信号。这允许任何父级层次结构,子小部件不必了解它们的使用方式或它们的显示顺序。主小部件处理所有这些。

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


class MainWindow(QMainWindow):

def __init__(self, parent=None):
'''
Constructor
'''
QMainWindow.__init__(self, parent)
self.central_widget = QStackedWidget()
self.setCentralWidget(self.central_widget)
self.start_screen = Start(self)
self.second_screen = Second(self)
self.central_widget.addWidget(self.start_screen)
self.central_widget.addWidget(self.second_screen)
self.central_widget.setCurrentWidget(self.start_screen)

self.start_screen.clicked.connect(lambda: self.central_widget.setCurrentWidget(self.second_screen))
self.second_screen.clicked.connect(lambda: self.central_widget.setCurrentWidget(self.start_screen))



class Start(QWidget):

clicked = pyqtSignal()

def __init__(self, parent=None):
super(Start, self).__init__(parent)
layout = QHBoxLayout()
button = QPushButton(text=QString('Push me!'))
layout.addWidget(button)
self.setLayout(layout)
button.clicked.connect(self.clicked.emit)


class Second(QWidget):

clicked = pyqtSignal()

def __init__(self, parent=None):
super(Second, self).__init__(parent)
layout = QHBoxLayout()
button = QPushButton(text=QString('Back to Start!'))
layout.addWidget(button)
self.setLayout(layout)
button.clicked.connect(self.clicked.emit)


app = QApplication(sys.argv)
myWindow = MainWindow(None)
myWindow.show()
app.exec_()

关于python - 在 QMainWindows 中央小部件中的小部件之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35612901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com