PyQt6 的“QMessageBox.Yes”的替代方案

问题描述

我正在尝试将我的脚本从 PyQt5 移植到 PyQt6。多亏了 this answer,我已经找到了如何移植大部分内容方法,但是,我遇到了一个问题。

我发现 PyQt6 使用 QtWidgets.QMessageBox.StandardButtons.Yes 而不是 PyQt5 的 QtWidgets.QMessageBox.Yes

但是,在打开 QMessageBox 后检查用户是否按下“是”时,将 QtWidgets.QMessageBox.Yes 替换为 QtWidgets.QMessageBox.StandardButtons.Yes 不起作用(请查看下面的示例)。


示例:

PyQt5:

reply = QtWidgets.QMessageBox()
reply.setText("Some random text.")
reply.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)

x = reply.exec_()

if x == QtWidgets.QMessageBox.Yes:
    print("Hello!")

打印“你好!”这里工作正常。 (16384 == 16384)

PyQt6:

reply = QtWidgets.QMessageBox()
reply.setText("Some random text.")
reply.setStandardButtons(QtWidgets.QMessageBox.StandardButtons.Yes | 
                         QtWidgets.QMessageBox.StandardButtons.No)

x = reply.exec()

if x == QtWidgets.QMessageBox.StandardButtons.Yes:
    print("Hello!")

“你好!”这里根本不打印。 (16384 != StandardButtons.yes)


我知道我可以做到:

x = reply.exec()

if x == 16384:
    print("Hello!")

因为,按“是”后,QMessageBox 等于 16384 (see this),但我想使用这种方法,而是使用类似 PyQt5 示例的内容.

解决方法

这有点奇怪。根据 QMessageBox.exec 的文档:

当使用带有标准按钮的 QMessageBox 时,此函数返回 一个 StandardButton 值,指示标准按钮 点击。

您使用的是标准按钮,因此应该返回一个 QMessageBox.StandardButtons 枚举。

还值得一提的是,在 PyQt5 中比较整数和枚举不是问题,因为枚举是用 enum.IntEnum 实现的。现在,它们是通过 enum.Enum 实现的。来自Riverbank Computing website

所有枚举现在都实现为 enum.Enum (PyQt5 使用 enum.IntEnum 用于作用域枚举和用于传统命名枚举的自定义类型)。 PyQt5 每当需要枚举时都允许 int 但 PyQt6 需要 正确的类型。

但是,由于某种原因,QMessageBox.exec 返回一个整数(我只是用 PyQt6==6.0.0 尝试过)!

现在,您可以通过从返回的整数故意构造一个枚举对象来解决这个问题:

if QtWidgets.QMessageBox.StandardButtons(x) == QtWidgets.QMessageBox.StandardButtons.Yes:
            print("Hello!")

而且,由于您要比较枚举,我建议使用 is 而不是 ==

,

QtWidgets.QMessageBox.StandardButtons 在 PyQt6 中使用 enum.Flag 实现,而 QDialog.exec() 返回 int。遗憾的是,这些无法直接比较,但您仍然可以使用:

if x == QtWidgets.QMessageBox.StandardButtons.Yes.value:
    print("Hello!")

请注意,惯用的 x == int(Yes) 也不起作用。

PyQt5 使用包装的自定义 StandardButtons 类(输入 Yes | No 以查看此内容),而不是另一个答案声称的 enum.IntEnumIntEnum 本来是一个合乎逻辑的选择,因为它特别允许 int 比较。

,

StandardButtons 不是我可以为 QMessageBox 选择的属性/方法。不确定这是否可能在过去 4 个月内更新,但对我来说,代码适用于 StandardButton 而不是 StandardButtons

from PyQt6.QtWidgets import QMessageBox

reply = QMessageBox()
reply.setText("Some random text.")
reply.setStandardButtons(QMessageBox.StandardButton.Yes | 
                     QMessageBox.StandardButton.No)

x = reply.exec()

if x == QMessageBox.StandardButton.Yes:
    print("Hello!")
,

我遇到了同样的问题(从 PyQt5 到 PyQt6),但以这种方式编码它运行流畅:

if QtWidgets.QMessageBox.critical(self,"Foo","PROTECTION NOT FOUND - Exit",QtWidgets.QMessageBox.StandardButtons.Yes):
                print("Exit")

我将其用作“关键”或“问题”甚至“信息”,并且它一直在运行

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...