首页 > 代码库 > PyQt挖地雷游戏学习笔记(2)

PyQt挖地雷游戏学习笔记(2)

分析多个文件组成的源代码,最好使用辅助工具。

我试过Source Navigator 和 Source Insight,感觉后者功能多些,比较好用。

一、程序的组成模块等文件

这个挖地雷游戏,主要由2种文件组成:

1、程序模块

主程序main.py:负责主窗口物件,按钮和菜单的设置、事件处理、程序初始化、结束等等。

游戏逻辑模块game_scene.py:负责游戏规则、棋盘显示、胜负裁判、记录得分等等。

“导入”文件lib.py:导入一些通用的模块,其他文件只需导入lib.py。

游戏设置模块setup.py:由菜单打开的对话框,设置棋盘大小和地雷数目。

游戏记分模块score.py:玩家挖出全部地雷获胜后,弹出对话框,游戏记分。

默认设置模块config.py:棋盘大小、地雷多少,由其存为默认设置。

2、GUI界面蓝图

主窗口:mainwindow.ui
记分对话框:score.ui
设置对话框:setup.ui

另外,还有一个默认设置数据文件config.cfg。

二、程序的GUI初始化

这个挖地雷程序,没有把界面蓝图ui文件用pyuic4转换成py文件,而是直接使用ui文件。

在GUI初始设置上,有其明显特点,与老式PyQt程序不同。这具体表现在以下几个方面:

1、首先装载GUI蓝图

在模块中class体外,使用函数 loadUiType(ui_file),先把GUI界面蓝图载入内存,

以实现相关具体物件和机制;

各模块在实例化、初始化各个class之前,首先做这件事情。如:

main.py模块中的 form, base = loadUiType("mainwindow.ui")

setup.py模块中的 form, base = loadUiType("setup.ui")

score.py模块中的 form, base = loadUiType("score.ui")

2、处理“事件”的方式有所简化

例如,mainwindow.ui中,有以下菜单项:

<addaction name="actionAbout_Qt"/>

<addaction name="action_New"/>

<addaction name="action_Pause"/>

<addaction name="action_Full_Screen"/>

<addaction name="action_Score"/>

<addaction name="action_Setup"/>

把上述name加上头、尾:on_  和 _triggered,作为函数名,

并以@pyqtSlot()修饰,在main.py中形成处理“信号”的“槽”:

@pyqtSlot()
def on_actionAbout_Qt_triggered(self):

@pyqtSlot()
def on_action_New_triggered(self):

@pyqtSlot()
def on_action_Pause_triggered(self):

@pyqtSlot()
def on_action_Full_Screen_triggered(self):

@pyqtSlot()
def on_action_Score_triggered(self):

@pyqtSlot()
def on_action_Setup_triggered(self):

Qt的“信号-槽”机制,没有什么“逐级上传”等花头,简明实用。

另外,“信号-槽”的关联函数connect,只用1个参数,即“槽名”,

与Qt要用4个参数相比,简化许多。如main.py的class Face中:

scene.changeStatus.connect(self.changeStatus)
self.button.clicked.connect(self.me)

并且,一个信号,可与多个槽关联。如:

在game_scene.py中定义的信号

changeStatus =  pyqtSignal(int)

分别与main.py中2个槽changeStatus关联。一是在上述class Face里,

二是在class MainWindow里。

PyQt挖地雷游戏学习笔记(2)