我在尝试将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"))
我的问题是
>我收到如下错误消息.
self.setupUi();
TypeError:setupUi()缺少1个必需的位置参数:“ Form”
但是如果我更改self.setupUi();进入self.setupUi(self);在myUI.py中
有用.我想知道为什么必须在self.setui()中调用self
>在myUI.py中,为什么没有def setupUi(self,Form):,而不是def setupUi(self):
我知道这是因为我们将Form视为变量,并将在以后使用它.但是,为什么我们需要它?或者我们可以将其创建为self.Form而不是调用Form
谢谢!
解决方法:
更改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方法(self是Prog实例对其自身的引用).在setupUi方法中,此引用称为Form,并且使用了很多次,如您的代码所示:
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
如此命名Form可能是因为您在Qt Creator中将objectName设置为Form.但是,无论它是什么名称,都是对自动生成文件需要设置的父窗口小部件的引用.从概念上讲,如果您给它们起同样的名字,例如重命名您的Prog类和UI objectName类似于ProgramUI.