PyQt6 的“QMessageBox.Yes”替代方案

问题描述 投票:0回答:7

我正在尝试将我的脚本从 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 示例的方法。

python pyqt pyqt5 pyqt6
7个回答
7
投票

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!")

4
投票

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 比较。


3
投票

这有点奇怪。根据 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
而不是
==


1
投票

我知道答案可能有点晚了,但这就是 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() )

0
投票

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

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

我将其用作“批评”或“问题”,甚至“信息”,并且它始终在运行


0
投票

这种方式也对我很有帮助,主要是因为它已经翻译了按钮的文本。

    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()

0
投票
pop_up = QMessageBox.question(
            self,
            "Exit Application!",
            "Are you sure you want to exit the Application?",   
        )
        if pop_up == QMessageBox.StandardButton.Yes:
© www.soinside.com 2019 - 2024. All rights reserved.