如何在PyQT中分离ui和实现?

时间:2014-11-30 09:57:51

标签: python user-interface inheritance pyqt pyside

我在尝试分离ui和实现文件时有一个问题。 我使用QT创建者创建* .ui,然后将其转换为* .py

main.py

from PyQt5 import QtCore, QtGui, QtWidgets 
from myUI import Ui_Form
import sys

class Prog(Ui_Form):
    def __init__(self):
        super().__init__();

def main():
    Program =  QtWidgets.QApplication(sys.argv);
    MyProg=Prog();
    MyProg.show();
    Program.exec_();

if __name__=='__main__':
    main();

myUI.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(QtWidgets.QWidget):
    def __init__(self):
        super().__init__();
        self.setupUi();
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(30, 230, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(210, 250, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.textEdit = QtWidgets.QTextEdit(Form)
        self.textEdit.setGeometry(QtCore.QRect(120, 80, 104, 87))
        self.textEdit.setObjectName("textEdit")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))
        self.pushButton_2.setText(_translate("Form", "PushButton"))

我的问题是

  1. 我收到错误消息如下。

    self.setupUi(); TypeError:setupUi()缺少1个必需的位置参数:'Form'

    但是如果我将 self.setupUi(); 更改为myUI.py中的 self.setupUi(self);

    它有效。我想知道为什么必须在 self.setui()

  2. 中调用 self
  3. 在myUI.py中,为什么有 def setupUi(self,Form):,而不是 def setupUi(self):

    我知道这是因为我们将Form视为变量,稍后会使用它。但是,为什么我们需要它呢?或者我们可以创建一个成员 self.Form 而不是调用表单

  4. THX!

1 个答案:

答案 0 :(得分:4)

更改UI文件是一个好主意,因为每次更新Qt Creator中的UI时都会重新生成,任何更改都将丢失。

相反,创建另一个为您调用自动生成的文件的UI类(并且还有其他设计用于定义UI类,正如ekhumoro指出的那样):

class Prog(QtGui.QMainWindow):
    def __init__(self):
        super().__init__();
        self.ui = Ui_Form()
        self.ui.setupUi(self)

if __name__=='__main__':
    Program =  QtWidgets.QApplication(sys.argv)
    MyProg = Prog()
    MyProg.show()
    sys.exit(Program.exec_())

通过这种方式,类Prog的实例将传递到setupUi方法(selfProg实例对其自身的引用)。在setupUi方法中,此引用称为Form,并且多次使用,如代码中所示:

Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)

Form之所以如此命名可能是因为您在Qt Creator中将objectName设置为Form。但是,无论它被称为什么,这都是对自动生成的文件需要设置的父窗口小部件的引用。从概念上讲,如果你将它们命名为相同,那将更有意义,例如将您的Prog类和用户界面objectName重命名为ProgramUI