QMessageBox добавить пользовательскую кнопку и держать открытым - PullRequest
0 голосов
/ 02 июля 2019

Я хочу добавить пользовательскую кнопку в QMessagebox, которая открывает окно matplotlib, наряду с кнопкой Ok, которую пользователь может щелкнуть, когда он хочет закрыть ее

В настоящее время у меня это работает, но я хочу, чтобы две кнопки делали разные вещи, а не открывали окно.

Я знаю, что могу просто создать диалоговое окно с желаемыми результатами, но я хотел знать, как это сделать с помощью 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

Ответы [ 3 ]

1 голос
/ 03 июля 2019

Немного дурацкий 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()
1 голос
/ 03 июля 2019

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_()), так как это может привести к неожиданному поведению, если вы не знаете, что делаете.

0 голосов
/ 02 июля 2019

Хорошо, во-первых, вы ничего не используете в QtCore, поэтому нет необходимости импортировать это.Это должно помочь вам понять, что вам нужно делать.Я настроил его чуть-чуть, и мне пришлось добавить 2 sys.exits или когда вы нажали View Graphs, программа просто зависла из-за того, как вы сейчас это настроили.Если вы не хотите настраивать этот поток кода, извлеките файл 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_())

Aka yourне является избыточным, если / else будет выглядеть следующим образом

    if bttn == QMessageBox.Ok:
        print("Ok")
    else:
        print("View Graphs")

    sysExit()
...