PyQt5:将 loadUi 与来自 Qt Designer 的升级小部件一起使用

PyQt5: using loadUi with promoted widgets from Qt Designer

完全是 Qt 和 Qt Designer 的新手。 我尝试按照一些在线教程来寻找一种在 Qt 中嵌入 matplotlib 图形的方法。 显然,该方法是使用 QWidget 的子类,这是通过“提升”QWidget 来完成的。

我尝试了这个 SE 中显示的方法 and this youtube video

在不提升 QWidget 的情况下,*.ui 文件可以加载到 python 而下面的脚本没有任何问题。

from PyQt5 import QtWidgets, uic
import sys

class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('untitled.ui', self)
        self.show()

app = QtWidgets.QApplication(sys.argv)
window = Ui()
app.exec_()

但是当我如下推广QWidget时,我得到以下错误。

Traceback (most recent call last):
  File "C:\Users\user.user\Desktop\pyqt_gui.py", line 11, in <module>
    window = Ui()
  File "C:\Users\user.user\Desktop\pyqt_gui.py", line 7, in __init__
    uic.loadUi('untitled.ui', self)
...
...
...
  File "C:\Users\user.user\Anaconda3\lib\site-packages\PyQt5\uic\Loader\qobjectcreator.py", line 115, in search
    module = __import__(mname, {}, {}, (cls,))
ModuleNotFoundError: No module named 'canvas'

有人可以解释一下吗?

您遵循的指南似乎没有足够清楚地解释如何 link 提升的小部件到您的 Canvas class,因为您的屏幕截图显示了错误的值。当你第一次在Promoted Widgets对话框中输入Promoted class名称时,Qt Designer会自动填充Header文件,所以它最终看起来像这样:

但这旨在用于 C++ 项目而不是 Python 项目,因此您需要将“canvas.h”更改为包含您的 Python 模块的导入路径Canvasclass。因此,如果该模块名为“canvas.py”并且与“pyqt_gui.py”文件位于同一文件夹中,您只需编辑 头文件到“camvas”(即没有扩展名)。要修复现有的 ui-file,您可以 re-open Promoted Widgets 对话框,然后 double-click 当前 header-file 值来编辑它(然后 确保之后保存更改):

这将导致以下行被添加到生成的 Python 模块中:

from canvas import Canvas

(如果你想在 Qt Designer 中预览这个,你可以 select Form -> View Python menu-bar 中的代码)。


注意:您可以输入任何有效Python导入路径作为头文件。因此,如果您的自定义小部件模块位于名为“widgets”的 sub-package 中,您可以输入“widgets.canvas”。此外,还可以通过 loadUi 的参数指定 base-package 来使用相对导入。在那种情况下,您将输入“.canvas”(注意前导点)作为 头文件 ,然后像这样调用 loadUi

uic.loadUi('untitled.ui', self, package='widgets')