python 中 "Dont show this message again" 的 QMessageBox
QMessageBox with "Dont show this message again" in python
我正在使用 PyQt 5 开发 UI。我正在使用 stackedWidget
在屏幕之间切换。每次打开屏幕时,我都会显示一条弹出消息 (QMessageBox
),但我希望能够让用户定义 he/she 是否希望在下次 he/she 时看到弹出消息回到屏幕。我试过这个 ,但是当我使用一种方法来显示弹出消息时,超链接中描述的解决方案不起作用。我开发了一个MVCE来帮忙。
MainWindow.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"))
window图表
迭代 1 - Window 'i' 显示并显示弹出窗口并由用户标记复选框。
迭代 2 - 用户转到 window j,显示弹出窗口但未标记复选框。
迭代 3 - 用户转到 windowk,显示弹出窗口并由用户标记复选框。
迭代 4 - 用户返回 window i,弹出窗口未显示,因为他在迭代 1 上标记了复选框。
迭代 5 - 用户返回到 window k,因为他在迭代 3 上标记了复选框。
迭代 6 - 用户再次转到 window j,现在他在显示弹出窗口时标记复选框。
迭代 7 - 用户返回 window i,弹出窗口未显示,因为他在迭代 1 上标记了复选框。
迭代 8 - 用户返回 window j 并且未显示弹出窗口,因为在迭代 6 中他标记了复选框。
迭代 9 - 用户转到 window k 并且未显示弹出窗口,因为他在迭代 3 上标记了复选框。
您需要将复选框状态存储在某处,您不能指望它“神奇地”起作用。
创建一个空列表,通过为更改的页面添加参数来更改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")
为了将来参考,请尽量在您的帖子中更加清晰,回答所有要求,避免不必要和重复的评论,并避免含糊不清的陈述,例如“不起作用”:一个短语像那样,没有任何关于 什么 不起作用的进一步解释,对我们来说没有任何意义,它需要烦人的评论来等待你应该首先提供的澄清.
我正在使用 PyQt 5 开发 UI。我正在使用 stackedWidget
在屏幕之间切换。每次打开屏幕时,我都会显示一条弹出消息 (QMessageBox
),但我希望能够让用户定义 he/she 是否希望在下次 he/she 时看到弹出消息回到屏幕。我试过这个
MainWindow.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"))
window图表
迭代 1 - Window 'i' 显示并显示弹出窗口并由用户标记复选框。
迭代 2 - 用户转到 window j,显示弹出窗口但未标记复选框。
迭代 3 - 用户转到 windowk,显示弹出窗口并由用户标记复选框。
迭代 4 - 用户返回 window i,弹出窗口未显示,因为他在迭代 1 上标记了复选框。
迭代 5 - 用户返回到 window k,因为他在迭代 3 上标记了复选框。
迭代 6 - 用户再次转到 window j,现在他在显示弹出窗口时标记复选框。
迭代 7 - 用户返回 window i,弹出窗口未显示,因为他在迭代 1 上标记了复选框。
迭代 8 - 用户返回 window j 并且未显示弹出窗口,因为在迭代 6 中他标记了复选框。
迭代 9 - 用户转到 window k 并且未显示弹出窗口,因为他在迭代 3 上标记了复选框。
您需要将复选框状态存储在某处,您不能指望它“神奇地”起作用。
创建一个空列表,通过为更改的页面添加参数来更改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")
为了将来参考,请尽量在您的帖子中更加清晰,回答所有要求,避免不必要和重复的评论,并避免含糊不清的陈述,例如“不起作用”:一个短语像那样,没有任何关于 什么 不起作用的进一步解释,对我们来说没有任何意义,它需要烦人的评论来等待你应该首先提供的澄清.