gpt4 book ai didi

python - 如何在不导入自定义widget类包的情况下使用自定义widget和uic.loadUi?

转载 作者:行者123 更新时间:2023-12-01 03:47:20 26 4
gpt4 key购买 nike

使用 PyQt4 的 uic.loadUi ,我想加载一个 .ui 文件并在其中使用自定义小部件。这意味着使用 uic.loadUi 的第三个 package 参数,它将导入包含自定义小部件类的包。

但是,我希望在调用 uic.loadUi 的同一文件中定义自定义小部件的类。我正在尝试像这样实现这一目标:

class MyCustomClass(QtWidgets.QPushButton):
""" This is my custom class for my custom widget """
def __init__(self, *args):
QtWidgets.QPushButton.__init__(self, *args)

...

sys.modules['mycustompackage'] = MyCustomClass
uic.loadUi('my_ui.ui', self, 'mycustompackage') # Loads .ui file which contains the MyCustomWidget widget

但是,这会返回以下错误:

AttributeError: type object 'MyCustomClass' has no attribute 'MyCustomWidget'

我可以做些什么来使其真正起作用吗?我怀疑 MyCustomClass 没有以 uic.loadUi 的方式定义期待它。

在 Qt Designer 中,我提升了 MyCustomWidget:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="MyCustomWidget" name="customWidget">
<property name="geometry">
<rect>
<x>50</x>
<y>70</y>
<width>113</width>
<height>32</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>MyCustomWidget</class>
<extends>QPushButton</extends>
<header>MyCustomClass</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
<小时/>

解决方案

我使用上面的 .ui 文件解决了这个问题,如下所示:

class MyCustomClasses(object):
class MyCustomWidget(QtWidgets.QPushButton):
def __init__(self, *args):
QtWidgets.QPushButton.__init__(self, *args)

...

sys.modules['MyCustomClasses'] = MyCustomClasses
uic.loadUi('my_ui.ui', self) # Loads .ui file which contains MyCustomWidget

最佳答案

引用您链接到的文档, loadUi 的第三个参数是:

the optional package that is the base package for any relative imports of custom widgets [emphasis added]

必须在 ui 中指定从中导入自定义类的实际模块名称。文件本身。在 Qt Designer 中,这是通过将“头文件”设置为适当的值来实现的,它将存储在 <header> 中。 ui 内的标签文件。请注意,该值可以是模块的完全限定包路径(例如“pkg.mymodule”) - 在这种情况下,不需要使用 loadUi 的第三个参数。 。永远不需要 sys.module黑客攻击。

loadUi功能相当简单。它只是以与命令行工具完全相同的方式生成一个 python 模块,然后使用 exec 加载它。 .

关于python - 如何在不导入自定义widget类包的情况下使用自定义widget和uic.loadUi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38783911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com