Python PyQt5添加一个don';不要将此mesasge复选框再次显示到QMessageBox

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

我正在努力让它工作。 我尝试从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.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()