将QMessageBox设置转移到Python中的单独类

时间:2018-10-22 10:28:35

标签: python python-3.x pyqt pyqt5

我已经使用QtDesigner制作了ui文件,然后将其用于制作类,例如

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()将结果发送回呼叫。

对于第二个弹出窗口,将MyBaseClassMyClass放在什么位置上,我感到很困惑。

2 个答案:

答案 0 :(得分:1)

Qt Designer提供了一个用于填充窗口小部件的类,因此建议的方法是继承窗口小部件并从所生成的Qt Designer的类继承,例如Qt Designer提供的结构具有以下结构:

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

    def retranslateUi(self, AAA):
        ...

然后根据模板,您应选择QMainWindow,QDialog或QWidget作为MyBaseClass并调用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")

答案 1 :(得分:0)

示例的完整解决方案是

=ArrayFormula(join(" ", if(len(split(A1, " "))<3, split(A1, " "), proper(split(A1," ")))))

可以在任何地方用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)) 进行呼叫