代码之家  ›  专栏  ›  技术社区  ›  Kajsa

在python中将qmessagebox设置转移到单独的类

  •  0
  • Kajsa  · 技术社区  · 6 年前

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

    我对该把什么作为 MyBaseClass MyClass 第二个弹出窗口。

    2 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc    6 年前

    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")
    
        2
  •  0
  •   Kajsa    6 年前

    示例的完整解决方案是

    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_() 从任何地方