我正在尝试将我的脚本从 PyQt5 移植到 PyQt6。感谢这个答案,我已经弄清楚如何移植大部分内容,但是,我遇到了一个问题。
我发现 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(参见此),但我想不使用这种方法,而是使用类似 PyQt5 示例的方法。
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!")
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 比较。
这有点奇怪。根据 QMessageBox.exec 的文档:
当使用带有标准按钮的 QMessageBox 时,此函数返回 指示标准按钮的 StandardButton 值 点击。
您正在使用标准按钮,因此这应该返回一个
QMessageBox.StandardButtons
枚举。
还值得一提的是,在 PyQt5 中比较整数和枚举并不是问题,因为枚举是用
enum.IntEnum
实现的。现在,它们是通过 enum.Enum
实现的。来自RiverbankComputing网站:
所有枚举现在都实现为 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
而不是 ==
。
我知道答案可能有点晚了,但这就是 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() )
我遇到了同样的问题(从 PyQt5 到 PyQt6),但以这种方式编码它运行顺利:
if QtWidgets.QMessageBox.critical(self,"Foo","PROTECTION NOT FOUND - Exit",QtWidgets.QMessageBox.StandardButtons.Yes):
print("Exit")
我将其用作“批评”或“问题”,甚至“信息”,并且它始终在运行
这种方式也对我很有帮助,主要是因为它已经翻译了按钮的文本。
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Icon.Information)
msgBox.setWindowTitle('Excluir Ponto')
msgBox.setText('Tem certeza que deseja excluir o ponto {point}?'.format(point = self.dialogCUDP.UI.lineEditPoint.text()))
btn_delete = msgBox.addButton('Excluir', QMessageBox.ButtonRole.YesRole)
btn_cancel = msgBox.addButton('Cancelar', QMessageBox.ButtonRole.NoRole)
msgBox.exec()
if msgBox.clickedButton() == btn_delete:
if self._serverOn:
if self.GM.dfPointsManager.deletePointPMCSV(Priceformat.setFormatStrFloat(self.dialogCUDP.UI.lineEditPoint.text())):
QMessageBox.information(self, 'Excluir Ponto', 'Ponto {point}, excluído com sucesso!'.format(point = self.dialogCUDP.UI.lineEditPoint.text()))
self.disableFieldCUDPoint()
self.clearFieldCUDPoint()
else:
QMessageBox.warning(self, 'Excluir Ponto', 'Não foi possível excluir o ponto {point}!\nPor favor, tente novamente'.format(point = self.dialogCUDP.UI.lineEditPoint.text()))
msgBox.close()
else:
if self._createnewpointPM.deletePointPMCSV(Priceformat.setFormatStrFloat(self.dialogCUDP.UI.lineEditPoint.text())):
QMessageBox.information(self, 'Excluir Ponto', 'Ponto {point}, excluído com sucesso!'.format(point = self.dialogCUDP.UI.lineEditPoint.text()))
self.disableFieldCUDPoint()
self.clearFieldCUDPoint()
else:
QMessageBox.warning(self, 'Excluir Ponto', 'Não foi possível excluir o ponto {point}!\nPor favor, tente novamente'.format(point = self.dialogCUDP.UI.lineEditPoint.text()))
msgBox.close()
pop_up = QMessageBox.question(
self,
"Exit Application!",
"Are you sure you want to exit the Application?",
)
if pop_up == QMessageBox.StandardButton.Yes: