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

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

又遇到一个有意思的问题,它提醒了查阅文档和相关源码,与测试的重要性。

直接上代码,setup.py

"""
module: setup
"""
from lib import *
from config import *

form, base = loadUiType("setup.ui")
class SetupDlg(QDialog, form):
    def __init__(self):
        super(SetupDlg, self).__init__()
        self.setupUi(self)
        self.sbW.setValue(conf.w)
        self.sbH.setValue(conf.h)
        self.sbMines.setValue(conf.mines)

    def accept(self):
        
        conf.w = self.sbW.value()
        conf.h = self.sbH.value()
        conf.mines = self.sbMines.value()
        conf.save()
        super(SetupDlg, self).accept()

    @pyqtSlot()
    def on_pbSmall_clicked(self):
        self.sbW.setValue(10)
        self.sbH.setValue(10)
        self.sbMines.setValue(10)

    @pyqtSlot()
    def on_pbMiddle_clicked(self):
        self.sbW.setValue(16)
        self.sbH.setValue(16)
        self.sbMines.setValue(40)

    @pyqtSlot()
    def on_pbBig_clicked(self):
        self.sbW.setValue(30)
        self.sbH.setValue(16)
        self.sbMines.setValue(80)

def getSetup():
    if SetupDlg().exec_() != QDialog.Accepted: return
    return (conf.w, conf.h), conf.mines

让我困惑的是以下2个问题:

函数accept()怎么回事?它没有@pyqtSlot()修饰,不像槽函数。

QDialog.Accepted 从何而来?

首先,请教《Qt助手》。它说:

void QDialog::accept () [virtual slot]

accept()的任务是关闭模态对话框,设定返回值Accepted。

它还说,模态对话框最常用的打开办法,是调用它的exec()函数。它会返回很有用的数值。

通常,把默认的按钮如OK,与槽accept()关联;按钮Cancel与reject()关联。

接着,再看相关代码的验证。

首先,用《Qt设计师》打开setup.ui,

看到buttonBox(对话框默认按钮)中,选中的是OK和Cancel。

从“信号/槽编辑器”中看到buttonBox发出的信号,accepted()和rejected(),

与相对应的槽,accept()和reject()。

再用普通文本编辑器,打开setup.py,也会看到类似的文字内容。

事情进行至此,好像全部问题都解决了。其实不然。

还有个要紧的问题:accept()为何调用super(SetupDlg, self).accept()

这一调用是否多余?要弄明白它,最好的办法是做实验、检测。

用注释屏蔽掉 super(SetupDlg, self).accept(),

运行main.py,在程序菜单选:Config -> Setup,在弹出的对话框中按钮OK,

程序毫无反应,对话框并不关闭。

这证明了,必须调用QDialog.accept(),才能返回QDialog.Accepted,以正常关闭对话框。

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