【发布时间】:2025-12-27 13:35:06
【问题描述】:
我正在使用 PyQt 5 开发 UI。我正在使用 stackedWidget 在屏幕之间切换。每次打开屏幕时,我都会显示一条弹出消息 (QMessageBox),但我希望用户能够定义他/她是否希望在下次返回屏幕时看到弹出消息。我试过这个solution,但是当我使用一种方法来显示弹出消息时,超链接中描述的解决方案不起作用。我开发了一个 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"))
窗口图
迭代 1 - 显示窗口“i”并显示弹出窗口并由用户标记复选框。
迭代 2 - 用户转到窗口 j,显示弹出窗口但未标记复选框。
迭代 3 - 用户转到窗口 k,弹出窗口被显示并且复选框被用户标记。
迭代 4 - 用户返回到窗口 i,没有显示弹出窗口,因为他在迭代 1 上标记了复选框。
迭代 5 - 用户返回窗口 k,因为他在迭代 3 上标记了复选框。
迭代 6 - 用户再次转到窗口 j,现在他在显示弹出窗口时标记复选框。
迭代 7 - 用户返回到窗口 i,没有显示弹出窗口,因为他在迭代 1 上标记了复选框。
第 8 次迭代 - 用户返回窗口 j 并且没有显示弹出窗口,因为在第 6 次迭代中他标记了复选框。
迭代 9 - 用户转到窗口 k 并且没有显示弹出窗口,因为他在迭代 3 上标记了复选框。
【问题讨论】:
-
您的问题令人困惑,假设您有 N 个窗口,并且您从窗口“i”转到窗口“j”,因此默认情况下会打开一个弹出窗口,现在我的问题是用户是否按下 QCheckBox并转到与窗口“i”不同的窗口“k”,那么它应该显示在弹出窗口中吗?也就是说,当用户按下复选框时,它不仅应该在返回“i”时显示,而且在它转到其他窗口时应该不再显示。
-
你是对的。假设我们有 2 个窗口, i 和 j 。用户在屏幕“i”上启动应用程序并标记复选框,然后他转到屏幕“j”,弹出窗口将再次显示。假设他没有在屏幕“j”上标记复选框并返回到屏幕“i”。弹出窗口不应出现在屏幕“i”上(因为他标记了复选框),当他返回屏幕“j”时,弹出窗口将再次显示,因为他没有标记复选框。
-
您的解释令人困惑,假设有 3 个窗口:“1”、“2”和“3”。如果应用程序在窗口“1”中启动,那么应该显示弹出窗口吗?如果我选中弹出复选框并转到窗口 2,那么应该显示弹出窗口吗?相反,如果我回到窗口 1,那么它应该显示吗?您的问题不清楚,因此我建议您制作一个图表来解释所需的行为
-
是的,你是对的。但是当您返回窗口 1 时,不应显示弹出窗口。我会尝试用油漆制作图表。
-
@Mutante 如果我错了,请纠正我,但如果我理解正确,每次显示“新”页面时都应该显示弹出窗口,无论之前的页面是什么,对吧?无论如何,“超链接中描述的解决方案不起作用”是什么意思?
标签: python pyqt qmessagebox