2011-10-07 117 views
2

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

例如,如果我点击新游戏,我将如何显示一个新的小部件替换旧小部件并询问用户的姓名?我现在是接近它的方式是一样的东西

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

那么一旦newGameButton按下它会去一个子程序...

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

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

回答

4

如果你想在窗体之间切换,那么你可以使用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的小部件。

+0

非常感谢=) – spibop