我想在qmessagebox中添加一个自定义按钮,该按钮可以打开matplotlib窗口,以及一个确定按钮,供用户关闭时单击
我目前有一些工作,但是我希望两个按钮可以分开操作而不打开窗口。
我知道我可以使用所需结果创建一个对话框窗口,但是我想知道如何使用QmessageBox。
import sys
from PyQt5 import QtCore, QtWidgets
def main():
app = QtWidgets.QApplication(sys.argv)
msgbox = QtWidgets.QMessageBox()
msgbox.setWindowTitle("Information")
msgbox.setText('Test')
msgbox.addButton(QtWidgets.QMessageBox.Ok)
msgbox.addButton('View Graphs', QtWidgets.QMessageBox.YesRole)
bttn = msgbox.exec_()
if bttn:
print("Ok")
else:
print("View Graphs")
sys.exit(app.exec_())
if __name__ == "__main__":
main()
所需结果:
OK按钮 - 关闭QmessageBox
查看图形按钮 - 打开matplotlib窗口并保持qmessagebox打开,直到用户单击OK
有点骇客的IMO,但是添加View Graphs
按钮后,您可以断开其clicked
信号并将其重新连接到您选择的插槽,例如。
import sys
from PyQt5 import QtCore, QtWidgets
def show_graph():
print('Show Graph')
def main():
app = QtWidgets.QApplication(sys.argv)
msgbox = QtWidgets.QMessageBox()
msgbox.setWindowTitle("Information")
msgbox.setText('Test')
msgbox.addButton(QtWidgets.QMessageBox.Ok)
yes_button = msgbox.addButton('View Graphs', QtWidgets.QMessageBox.YesRole)
yes_button.clicked.disconnect()
yes_button.clicked.connect(show_graph)
bttn = msgbox.exec_()
if bttn:
print("Ok")
sys.exit(app.exec_())
if __name__ == "__main__":
main()
一个qmessagebox,因为所有qdialogs都会阻止所有内容,直到返回exec_()
,但它也会自动将所有按钮连接到接受/拒绝的信号,无论如何返回exec_()
。
您代码的可能解决方案是:
app = QtWidgets.QApplication(sys.argv)
msgbox = QtWidgets.QMessageBox()
# the following is if you need to interact with the other window
msgbox.setWindowModality(QtCore.Qt.NonModal)
msgbox.addButton(msgbox.Ok)
viewGraphButton = msgbox.addButton('View Graphs', msgbox.ActionRole)
# disconnect the clicked signal from the slots QMessageBox automatically sets
viewGraphButton.clicked.disconnect()
# this is just an example, replace with your matplotlib widget/window
graphWidget = QtWidgets.QWidget()
viewGraphButton.clicked.connect(graphWidget.show)
msgbox.button(msgbox.Ok).clicked.connect(graphWidget.close)
# do not use msgbox.exec_() or it will reset the window modality
msgbox.show()
sys.exit(app.exec_())
也就是说,请谨慎使用QDialog.exec_()
外部(如"之前"(sys.exit(app.exec_())
调用,因为如果您不知道自己在做什么,可能会导致出乎意料的行为。
好吧,首先,您不使用QTCore中的任何内容,因此无需导入。这应该可以帮助您了解需要做什么。我对其进行了调整,然后我不得不添加2个sys.exits,或者按下视图图表时,由于您当前设置的方式,该程序刚刚挂起。如果您不选择调整此代码流,则将SYS.EXIT从IF/else中拉出,然后立即将其放在IF/else之后 - 没有任何不必要的冗余代码
from sys import exit as sysExit
from PyQt5.QtWidgets import QApplication, QMessageBox
def Main():
msgbox = QMessageBox()
msgbox.setWindowTitle("Information")
msgbox.setText('Test')
msgbox.addButton(QMessageBox.Ok)
msgbox.addButton('View Graphs', QMessageBox.YesRole)
bttn = msgbox.exec_()
if bttn == QMessageBox.Ok:
print("Ok")
sysExit()
else:
print("View Graphs")
sysExit()
if __name__ == "__main__":
MainThred = QApplication([])
MainApp = Main()
sysExit(MainThred.exec_())
又名您的非冗余,如果/其他人看起来如下
if bttn == QMessageBox.Ok:
print("Ok")
else:
print("View Graphs")
sysExit()