又遇到一个有意思的问题,它提醒了查阅文档和相关源码,与测试的重要性。
直接上代码,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,以正常关闭对话框。