首页 > 解决方案 > 在python中带有“不再显示此消息”的QMessageBox

问题描述

我正在使用 PyQt 5 开发 UI。我正在使用stackedWidget在屏幕之间切换。每次打开屏幕时,我都会显示一条弹出消息 ( QMessageBox),但我希望用户能够定义他/她是否希望在下次返回屏幕时看到弹出消息。我已经尝试过这个解决方案,但是当我使用一种方法来显示弹出消息时,超链接中描述的解决方案不起作用。我开发了一个 MVCE 来提供帮助。

主窗口.py:

import sys
from PyQt5.QtWidgets import QApplication, QMessageBox, QCheckBox
from PyQt5.QtWidgets import QMainWindow
from Ui_MainWindow import Ui_MainWindow
class MainWindow:
    def __init__(self):
        self.main_win = QMainWindow()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self.main_win)
        self.ui.stackedWidget.setCurrentWidget(self.ui.page)
        self.ui.pushButton.clicked.connect(self.show1)
        self.ui.pushButton_2.clicked.connect(self.show2)
    def popupInfo(self, msg1, msg2):
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        cb = QCheckBox()
        cb.setText("Don't show this again")
        msg.setCheckBox(cb)
        msg.setText(msg1)
        msg.setInformativeText(msg2)
        msg.setWindowTitle("Warning")
        msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
        retval = msg.exec_()
    def show(self):
        self.main_win.show()
    def show1(self):
        self.ui.stackedWidget.setCurrentWidget(self.ui.page)
        self.popupInfo("aaa","bbb")
    def show2(self):
        self.ui.stackedWidget.setCurrentWidget(self.ui.page_2)
        self.popupInfo("aaa", "bbb")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_win = MainWindow()
    main_win.show()
    sys.exit(app.exec_())

Ui_MainWindow.py:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(664, 522)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(120, 470, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(390, 470, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setGeometry(QtCore.QRect(20, 20, 581, 421))
        self.stackedWidget.setObjectName("stackedWidget")
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.stackedWidget.addWidget(self.page_2)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Screen 1"))
        self.pushButton_2.setText(_translate("MainWindow", "Screen 2"))

窗口示意图

在此处输入图像描述

迭代 1 - 显示窗口“i”并显示弹出窗口并由用户标记复选框。

迭代 2 - 用户转到窗口 j,显示弹出窗口但未标记复选框。

迭代 3 - 用户转到窗口 k,弹出窗口被显示并且复选框由用户标记。

迭代 4 - 用户返回窗口 i,没有显示弹出窗口,因为他在迭代 1 上标记了复选框。

迭代 5 - 用户返回窗口 k,因为他在迭代 3 上标记了复选框。

迭代 6 - 用户再次转到窗口 j,现在他在显示弹出窗口时标记复选框。

迭代 7 - 用户返回窗口 i,没有显示弹出窗口,因为他在迭代 1 上标记了复选框。

迭代 8 - 用户返回窗口 j 并且不显示弹出窗口,因为在迭代 6 上他标记了复选框。

迭代 9 - 用户转到窗口 k 并且没有显示弹出窗口,因为他在迭代 3 上标记了复选框。

标签: pythonpyqtqmessagebox

解决方案


您需要将复选框状态存储在某处,您不能期望它“神奇地”起作用。

创建一个空列表,通过为改变的页面添加一个参数来改变popupInfo函数,然后如果该页面在列表中,则不显示弹出窗口;否则添加页面,如果复选框被选中,并且根据您的需要,如果消息框被接受(您的示例不是很清楚,所以我们真的不知道消息框的实际用途是什么)。

class MainWindow:
    def __init__(self):
        # ...
        self.ignorePopups = []

    def popupInfo(self, page, msg1, msg2):
        if page in self.ignorePopups:
            return
        # ...
        retval = msg.exec_()
        if retval and cb.isChecked():
            self.ignorePopups.append(page)

    def show1(self):
        self.ui.stackedWidget.setCurrentWidget(self.ui.page)
        self.popupInfo(self.ui.page, "aaa", "bbb")

    def show2(self):
        self.ui.stackedWidget.setCurrentWidget(self.ui.page_2)
        self.popupInfo(self.ui.page_2, "aaa", "bbb")

为了将来参考,请尽量在您的帖子中更清楚,回答所有要求的内容,避免不必要和重复的评论,并避免诸如“不起作用”之类的模糊陈述:这样的短语,没有进一步解释什么不起作用'不起作用,对我们来说真的没有任何意义,而且它需要烦人的评论来等待你应该首先提供的澄清。


推荐阅读