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

Posted

技术标签:

【中文标题】PyQ5t:将 Qt Designer 加载到 Python 脚本中(loadUiType):如何检查错误原因?【英文标题】:PyQ5t: load Qt Designer into Python script (loadUiType): how to check error cause? 【发布时间】:2016-02-05 18:26:29 【问题描述】:

我在 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):

文件“字符串”,第 671 行,在 setupUi 中

TypeError:参数 1 具有意外类型“QRadioButton”

因此,在导入 XML 文件的过程中出现了一些问题。但是错误类型告诉我还不足以找到错误。

我仔细检查了我所有的 QRadioButton 小部件。不知道。

我使用设计器打开 Ui - 它打开时没有错误消息。

我将 UI 转换为 PY (pyiuc5) - 没有错误。

.ui 文件是 here。

在setupUI这样的封闭进程中,有什么方法可以找到错误?

【问题讨论】:

请按步骤: 1) 我从 UI 文件中删除所有插槽 2) 在 Python 脚本中我将所有方法命名为您的示例用作信号的方法。 3)我运行我的脚本。对吗? 【参考方案1】:

在这个 .ui 文件中,小部件与主窗口的插槽具有相同的名称。由于我们对主窗口进行子类化,小部件和插槽都在同一个命名空间中,所以编译的 .ui 文件中的命令 self.zero_fix = QtWidgets.QRadioButton(self.frame_4) 覆盖插槽 zero_fix()

【讨论】:

master_settare_fixfast_toggle 以及对象名称与插槽名称相同的任何其他连接也是如此。 是的,你是对的。这就是问题。在 Kuba Ober 的建议下,我立即开始改名。但是 OTHER 命名错误继续导致错误消息 - 所以我迷失了直到 steel.ne 解释了一切。谢谢各位! 由于这个答案是最好的,我想添加一个评论“如何检查错误原因”。实际上,您必须检查通用规则(例如命名)并分析 XML 文件。 .PY 文件中的行号(可以通过 pyuic 或转换器获得)与错误消息中引用的行号不同。不幸的是...... @drvlas。我添加了另一个答案来处理这个问题。【参考方案2】:

查看pyuic5 生成的输出,在第671 行。它应该在setupUi 方法内。这就是错误所指的。 uic.loadUiType 正在即时生成 Python 文件。然后您尝试执行它,它在运行时失败。

Nitpick:尝试从 .ui 文件中删除所有连接。它们不属于那里并且使代码更难维护,除非连接在同一文件中的小部件之间。只需按以下格式命名MainWindow 插槽:on_WIDGET_SIGNAL,其中 WIDGET 是小部件的名称,SIGNAL 是信号的名称,例如on_setADC1_clicked.

【讨论】:

第 671 行是 self.toolBar.addAction(self.action_Port) - 我看不出这个小部件有什么问题。现在我尝试删除插槽 我删除了插槽 - 没有任何改变。我删除了连接——好吧,那个错误已经消失了,尽管 Python 脚本现在不起作用。好吧,我的错误出现在 UI 文件的连接部分。最终的方法是从 Designer 重新安装所有连接。但是...我的问题是如何搜索这种类型的错误。 感谢有关命名的提示!并且 - 对于我词汇表中的一个新英语单词:BORKED。现在我知道手动编辑大 XML 文件的结果是什么了 :)【参考方案3】:

回答关于如何调试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(一个插槽),原因是重命名了一些错误。

【讨论】:

非常感谢!我打算澄清那些行号问题,但你已经给出了完整的解释。如果 steel.ne 和 Kuba Ober 的答案解决了我的命名错误,那么您就回答了标题问题。

以上是关于PyQ5t:将 Qt Designer 加载到 Python 脚本中(loadUiType):如何检查错误原因?的主要内容,如果未能解决你的问题,请参考以下文章

Qt Designer 和 PyQt5 自定义插件加载 TypeError

带有 Qt Designer 的 pyqtgraph:如何将 PlotItems 添加到 GraphicsLayoutWidget

获取 Qt 小部件以更新使用 Qt Designer 制作的 Qt 表单中的鼠标事件

如何配置 Qt Designer 以在 OSX 中加载 PyQt 小部件?

Qt Designer UI (python) 到 JSON

QT designer+ VS2013 获取网络时间