3

我正在尝试将我的脚本从 PyQt5 移植到 PyQt6。由于这个答案,我已经弄清楚了如何移植大部分东西,但是,我遇到了一个问题。

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

但是,当在 QMessageBox 打开后检查用户是否按下“是”时,替换QtWidgets.QMessageBox.YesQtWidgets.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(参见this),但我不想使用这种方法,而是使用类似 PyQt5 示例的方法。

4

5 回答 5

2

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

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

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

还值得一提的是,在 PyQt5 中将整数与枚举进行比较并不是问题,因为枚举是用enum.IntEnum. 现在,它们是用enum.Enum. 来自Riverbank Computing 网站

现在所有的枚举都实现为 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而不是==.

于 2021-01-15T12:46:11.950 回答
2

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

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

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

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

于 2021-01-17T08:22:35.477 回答
2

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!")
于 2021-05-29T17:36:15.230 回答
0

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

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

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

于 2021-01-20T17:08:32.903 回答
0

我知道答案可能有点晚了,但这就是 pyqt6 中对我有用的方法。

msg = QMessageBox()
msg.setIcon(QMessageBox.Icon.Information)

msg.setText('Teste')
msg.setInformativeText("This is additional information")
msg.setWindowTitle("MessageBox demo")
#msg.setDetailedText("The details are as follows:")
msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel)
msg.buttonClicked.connect(self.msgbtn)
msg.exec()

def msgbtn(self, i):
    print( "Button pressed is:",i.text() )
于 2022-03-03T09:00:08.917 回答