多个文件中的 PyQt 小部件

Posted

技术标签:

【中文标题】多个文件中的 PyQt 小部件【英文标题】:PyQt widgets in multiple files 【发布时间】:2011-10-07 17:22:02 【问题描述】:

我想通过编写一个简单的游戏来学习 PyQt。第一个小部件会有“新游戏”、“退出”等按钮。我无法理解如何从该菜单小部件过渡到新的小部件。

例如,如果我要单击“新游戏”,如何出现一个新的小部件来替换旧的小部件并询问用户的姓名?我现在接近它的方式类似于

Form = QtGui.QWidget()
ui = uiMainMenu()
ui.setupUi(Form)
Form.show()

然后一旦按下 newGameButton 就会进入一个子程序...

Form2 = QtGui.QWidget()
ui2 = uiNewGame()
ui2.setupUi(Form2)
Form2.show()

我不是要所有代码,只是解释我应该如何解决这个问题,因为上面的代码没有做深蹲。 谢谢!

【问题讨论】:

【参考方案1】:

如果你想在表单之间切换,那么你可以使用 QStackedWidget。 您可以在下面找到一个工作示例代码:

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


class Form1(QWidget):
    showForm2Signal = pyqtSignal()

    def __init__(self, parent=None):
        super(Form1, self).__init__(parent)
        self.newGameButton = QPushButton("New Game", self)
        self.quitButton = QPushButton("Quit", self)
        layout = QVBoxLayout(self)
        layout.addWidget(QLabel("<html>My Game<br>Start Page</html>"))
        layout.addWidget(self.newGameButton)
        layout.addWidget(self.quitButton)
        self.newGameButton.clicked.connect(self.showForm2Signal.emit)
        self.quitButton.clicked.connect(qApp.quit)


class Form2(QWidget):
    showForm1Signal = pyqtSignal()

    def __init__(self, parent=None):
        super(Form2, self).__init__(parent)
        self.backButton = QPushButton("Back", self)
        layout = QVBoxLayout(self)
        layout.addWidget(QLabel("New Game Started!"))
        layout.addWidget(self.backButton)
        self.backButton.clicked.connect(self.showForm1Signal.emit)


class MainWidget(QWidget):
    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)
        self.stack = QStackedWidget()
        layout = QVBoxLayout(self)
        layout.addWidget(self.stack)
        self.form1 = Form1(self)
        self.form2 = Form2(self)
        self.stack.addWidget(self.form1)
        self.stack.addWidget(self.form2)
        self.form1.showForm2Signal.connect(partial(self.stack.setCurrentWidget,
                                               self.form2))
        self.form2.showForm1Signal.connect(partial(self.stack.setCurrentWidget,
                                               self.form1))
        self.stack.setCurrentWidget(self.form1)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWidget()
    w.show()
    app.exec_()
    sys.exit()

如果您只想向用户询问名称,则可以使用 QDialog 小部件。

【讨论】:

以上是关于多个文件中的 PyQt 小部件的主要内容,如果未能解决你的问题,请参考以下文章

带有多个 qlineedit 小部件的 pyqt 上下文菜单

如何使小部件随 PyQt5 中的窗口缩放?

在 PyQt 中将多个小部件添加到 QTableWidget 单元格

如何使用 PyQt 中的样式表将小部件放在前面?

PyQt5 为多个相同类型的小部件重复代码

PyQt - 如何将多个信号连接到同一个小部件