我在Qt Designer中设计GUI,然后使用loadUiType方法在Puthon3脚本中加载UI文件:
class Main(QMainWindow, uic.loadUiType("adc_main_form.ui")[0]):
def __init__(self):
super(Main, self).__init__()
self.setupUi(self)
一切正常。然后我在表单设计上做了一点革命,它包含了很多重命名。所以我拿了Qt Designer的UI文件(XML文件)并在文本编辑器中编辑它。也许我犯了一些拼写错误。现在我在Python脚本开始时收到一条消息,在self.setupUi(self):
行文件“string”,第671行,在setupUi中
TypeError:参数1具有意外类型'QRadioButton'
因此,在导入XML文件的过程中出现了一些问题。但错误类型告诉我不足以找到错误。
我仔细检查了所有的QRadioButton小部件。不知道。
我使用Designer打开Ui - 它打开时没有错误消息。
我将UI转换为PY(pyiuc5) - 没有错误。
.ui
文件为here。
在setupUI这样一个封闭的过程中找到错误的方法是什么?
答案 0 :(得分:2)
在这个.ui文件中,小部件的名称与主窗口的插槽相同。当我们将主窗口子类化时,窗口小部件和插槽都在同一名称空间中,因此编译的.ui文件中的命令self.zero_fix = QtWidgets.QRadioButton(self.frame_4)
会覆盖插槽zero_fix()
答案 1 :(得分:1)
查看pyuic5
在第671行生成的输出。它应位于setupUi
方法内。这就是错误所指的内容。 uic.loadUiType
正在动态生成Python文件。然后,您尝试执行它,并在运行时失败。
Nitpick:尝试删除.ui文件中的所有连接。除非连接位于同一文件中的小部件之间,否则它们不属于那里并使代码更难维护。只需按以下格式命名MainWindow
个插槽:on_WIDGET_SIGNAL,其中WIDGET是小部件的名称,SIGNAL是信号的名称,例如: on_setADC1_clicked
。
答案 2 :(得分:1)
回答有关如何调试由uic
加载的文件的具体问题:
当您使用loadUiType
之类的方法时,它会创建通常由pyuic
生成的相同模块。但是不是将此模块写入磁盘,而是在其上调用exec
,以便动态执行代码,并且可以直接返回生成的class
对象。
但是,生成的代码与相当完全相同。使用pyuic
时,会在文件顶部添加一些注释行,这些注释行需要删除,以便回溯信息正确排列。更具体地说,额外的行需要用一个空行代替,这样模块的顶部看起来像这样:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
完成后,原始追溯现在给出了第671行:
self.zero_fix.clicked.connect(MainWindow.zero_fix)
TypeError
现在有意义了,因为self.zero_fix
(一个单选按钮)现在正在影响MainWindow.zero_fix
(一个广告位),因为一些错误的重命名。