问题描述
我正在尝试将我的脚本从 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.IntEnum
。 IntEnum
本来是一个合乎逻辑的选择,因为它特别允许 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")
我将其用作“关键”或“问题”甚至“信息”,并且它一直在运行