Python PyQt5添加一个don';不要将此mesasge复选框再次显示到QMessageBox
我正在努力让它工作。 我尝试从C++帖子转置到Python,没有乐趣: 我的大致代码如下:Python PyQt5添加一个don';不要将此mesasge复选框再次显示到QMessageBox,python,pyqt5,Python,Pyqt5,我正在努力让它工作。 我尝试从C++帖子转置到Python,没有乐趣: 我的大致代码如下: from PyQt5 import QtWidgets as qtw ... mb = qtw.QMessageBox cb = qtw.QCheckBox # following 3 lines to get over runtime errors # trying to pass the types it was asking for # and surely messing up mb.set
from PyQt5 import QtWidgets as qtw
...
mb = qtw.QMessageBox
cb = qtw.QCheckBox
# following 3 lines to get over runtime errors
# trying to pass the types it was asking for
# and surely messing up
mb.setCheckBox(mb(), cb())
cb.setText(cb(), "Don't show this message again")
cb.show(cb())
ret = mb.question(self,
'Close application',
'Do you really want to quit?',
mb.Yes | mb.No )
if ret == mb.No:
return
self.close()
上述操作执行时没有错误,但复选框没有显示(消息框显示)。
想想我是个基因笨蛋…而且慢,非常慢。
因此,请轻松学习我的学习曲线当尝试“移植”代码时,了解源语言的基础并对目标有更深入的了解是很重要的
例如,以代码的第一行和引用的问题为例:
QCheckBox *cb = new QCheckBox("Okay I understand");
<>上述C++中的行意味着正在创建QQuestBox类型的新对象(CB),并分配了<代码> qChigBox(…)>代码>的结果,返回该类的实例。为了阐明对象是如何声明的,下面介绍如何创建一个简单的整数变量:
int mynumber = 10
这是因为C++和许多语言一样,需要声明它的对象类型。
在Python(一种动态类型语言)中,这是不需要的(但在Python3.6中是可能的),但您仍然需要创建实例,这是通过使用类上的括号来实现的(这会导致调用它,并导致调用\uuuuuunew\uuuuuuu
和\uuuuuu init\uuuuu
)。然后,代码的前两行应该是:
mb = qtw.QMessageBox()
cb = qtw.QCheckBox()
最后一行或多或少意味着:使用实例和文本作为其参数,调用类QCheckBox的setText
函数。
事实上,如果QCheckBox是一个实际的python类,setText()
将如下所示:
class QCheckBox:
def setText(self, text):
self.text = text
当您执行cb=qtw.QCheckBox
时,您只创建了对该类的另一个引用,每次执行cb()
时,您都创建了一个新实例;同样的情况也会发生在mb
,因为您创建了对MessageBox类的另一个引用
以下一行:
mb.setCheckBox(mb(), cb())
同:
QMessageBox.setCheckBox(QMessageBox(), QCheckBox())
由于您每次都在创建新实例,因此结果绝对是零:没有对新实例的引用,并且在处理该行之后,它们将立即被丢弃(“垃圾收集”,也称为删除)
这就是实际执行上述操作的方式:
mb = qtw.QMessageBox()
cb = qtw.QCheckBox()
mb.setCheckBox(cb)
cb.setText("Don't show this message again")
现在,代码中存在一个基本缺陷:question()
是一个静态方法(实际上,对于Python来说,它更像是一个类方法)。静态方法和类方法是不作用于实例的函数,而只作用于类/的函数。QMessageBox的静态方法,如question
或warning
使用提供的参数创建QMessageBox的新实例,因此之前在创建的实例上所做的一切都将被完全忽略
这些方法是方便的函数,允许简单地创建消息框,而无需编写太多代码。由于这些方法只允许基于它们的参数(不包括添加复选框)进行自定义,因此显然不能使用它们,并且必须显式地对它们在“幕后”执行的操作进行编码
以下是最终代码的外观:
# create the dialog with a parent, which will make it *modal*
mb = qtw.QMessageBox(self)
mb.setWindowTitle('Close application')
mb.setText('Do you really want to quit?')
# you can set the text on a checkbox directly from its constructor
cb = qtw.QCheckBox("Don't show this message again")
mb.setCheckBox(cb)
mb.setStandardButtons(mb.Yes | mb.No)
ret = mb.exec_()
# call some function that stores the checkbox state
self.storeCloseWarning(cb.isChecked())
if ret == mb.No:
return
self.close()
该死!干杯,伙计,我没想到会有完整的教程。你太棒了!说真的,没有讽刺或双关语的意思。谢谢你花时间详细解释,就像给一个10岁的孩子。这正是我想要的,但肯定不是我所期待的。有机会理解隐藏的东西,用简单的英语解释,而不仅仅是复制粘贴,这让人耳目一新。祝你周末愉快,音乐爱好者先生。然后我也从战利品之地认识了你。然后:热那亚的问候,先生。我们将穿越隧道的尽头。。。在某个时刻。@Caligola你很受欢迎!希望如此。。。来自科莫的问候!
# create the dialog with a parent, which will make it *modal*
mb = qtw.QMessageBox(self)
mb.setWindowTitle('Close application')
mb.setText('Do you really want to quit?')
# you can set the text on a checkbox directly from its constructor
cb = qtw.QCheckBox("Don't show this message again")
mb.setCheckBox(cb)
mb.setStandardButtons(mb.Yes | mb.No)
ret = mb.exec_()
# call some function that stores the checkbox state
self.storeCloseWarning(cb.isChecked())
if ret == mb.No:
return
self.close()