QmessageBox添加自定义按钮并保持打开状态



我想在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()

相关内容

  • 没有找到相关文章

最新更新