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