Перенести настройку QMessageBox в отдельный класс в Python - PullRequest
0 голосов
/ 22 октября 2018

Я использовал QtDesigner для создания файлов пользовательского интерфейса, которые я затем использую для создания классов, например

class MyPopup1(MyBaseClass, MyClass):
    def __init__(self, parent=None):
        super(MyPopup1, self).__init__(parent)
        self.setupUi(self)
        ...

Конечно, я использовал для этого какое-то руководство, поэтому я не совсем уверен, что все это делает.Но теперь я написал код, который генерирует всплывающее окно, которое использует класс QMessageBox, и я хотел бы переместить этот код в отдельный класс, чтобы я мог вызывать его из нескольких мест.

Как переместить этот кодсделать класс MyPopup2?

MyPopup2 = QtWidgets.QMessageBox(parent = self.central_widget)
MyPopup2.setWindowTitle("My Popup 2")
MyPopup2.setText("Some text")
MyPopup2.setIcon(QtWidgets.QMessageBox.Question)
MyPopup2.addButton("Btn1", QtWidgets.QMessageBox.RejectRole)
MyPopup2.addButton("Btn2", QtWidgets.QMessageBox.ActionRole)
choice = MyPopup2.exec_()

Я знаю, что мне, вероятно, нужно подключить сигналы кнопок к функциям и использовать self.done() для отправки результата обратно на вызов.

IЯ в основном не понимаю, что нужно указать как MyBaseClass и MyClass для второго всплывающего окна.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Полное решение для примера:

class MyPopup2(QtWidgets.QMessageBox):
    def __init__(self, parent=None):
        super(NoMatch, self).__init__(parent)

        self.setWindowTitle("My Popup 2")
        self.setText("Some text")
    self.setIcon(QtWidgets.QMessageBox.Question)
    self.Btn1 = self.addButton("Btn1", QtWidgets.QMessageBox.RejectRole)
    self.Btn2 = self.addButton("Btn2", QtWidgets.QMessageBox.ActionRole)

    self.Btn1.clicked.connect(lambda: self.done(QtWidgets.QMessageBox.RejectRole))
    self.Btn2.clicked.connect(lambda: self.done(QtWidgets.QMessageBox.ActionRole))

, которое можно вызвать с помощью choice = MyPopup2.exec_() из любого места

0 голосов
/ 22 октября 2018

Qt Designer предоставляет класс, который служит для заполнения виджета, поэтому рекомендуемый способ - наследовать виджет и наследовать от сгенерированного класса Qt Designer, например, структура, которую предоставляет Qt Designer, имеет следующую структуру:

class MyClass(object):
    def setupUi(self, AAA):
        ...
        self.retranslateUi(AAA)
        QtCore.QMetaObject.connectSlotsByName(AAA)

    def retranslateUi(self, AAA):
        ...

Затем, в зависимости от шаблона, вы должны выбрать в качестве MyBaseClass QMainWindow, QDialog или QWidget и вызвать setupUi() - метод, которым вы добавляете другой виджет в окно, как вы указали:

class MyPopup1(MyBaseClass, MyClass):
    def __init__(self, parent=None):
        super(MyPopup1, self).__init__(parent)
        self.setupUi(self)
        ...

Но в случае, если вы собираетесь создать виджет, MyClass не требуется, поэтому в вашем случае решение будет следующим:

from PyQt5 import QtWidgets


class MyPopup2(QtWidgets.QMessageBox):
    def __init__(self, parent=None):
        super(MyPopup2, self).__init__(parent)
        self.setWindowTitle("My Popup 2")
        self.setText("Some text")
        self.setIcon(QtWidgets.QMessageBox.Question)
        self.addButton("Btn1", QtWidgets.QMessageBox.RejectRole)
        self.addButton("Btn2", QtWidgets.QMessageBox.ActionRole)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    popup = MyPopup2()
    if popup.exec_() == QtWidgets.QMessageBox.Accepted:
        print("Btn2")
    else:
        print("Btn1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...