PyQ5t:将Qt Designer加载到Python脚本(loadUiType):如何检查错误原因?

时间:2016-02-05 18:26:29

标签: python qt qt-designer pyqt5 loadui

我在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这样一个封闭的过程中找到错误的方法是什么?

3 个答案:

答案 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(一个广告位),因为一些错误的重命名。