【发布时间】:2014-06-11 21:20:42
【问题描述】:
我正在加载 .ui 文件,其中一个小部件 (QComboBox) 具有动态属性 (http://qt-project.org/doc/qt-5/properties.html#dynamic-properties)。 UI 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PopulateScriptConfig</class>
<widget class="QWidget" name="PopulateScriptConfig">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="langGroup">
<property name="title">
<string>Language</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QComboBox" name="langCombo">
<property name="ScriptingLangCombo" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="codeGroup">
<property name="title">
<string>Implementation</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPlainTextEdit" name="codeEdit"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
重要的部分是:
<widget class="QComboBox" name="langCombo">
<property name="ScriptingLangCombo" stdset="0">
<bool>true</bool>
</property>
</widget>
我正在使用QUiLoader::load() 加载文件。我扩展了QUiLoader 类,但只访问createWidget() 方法,我可以像这样查询每个小部件:
QWidget* UiLoader::createWidget(const QString& className, QWidget* parent, const QString& name)
{
QWidget* w = QUiLoader::createWidget(className, parent, name);
qDebug() << w->dynamicPropertyNames();
return w;
}
结果我看到显示的是空列表,所以似乎动态属性被完全忽略了。
注意,QtCreator 中的 UI 编辑器可以正确识别这个动态属性。
这个问题之前已经被问过/报告了 2 次,但没有提供解决方案:
- https://bugreports.qt-project.org/browse/QTBUG-11791?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab
- http://www.qtcentre.org/threads/32013-QUiLoader-Problem-No-Dynamic-Properties-Support
有什么想法吗?
附:我确保我加载了正确的文件。 3 次。
【问题讨论】:
-
我在最简单的示例项目中对此进行了测试,并确认这与我所做的任何事情都无关(重新实现 createWidget() 或其他任何事情)。这是 QUILoader 中的一个错误。当表单在构建时从 UI 文件生成为 C++ 代码时,动态属性可以正常工作,但在使用 QUiLoader 加载时不能正常工作。
-
现在我已经实现了一个巨大(而且不是很好)的解决方法,它让我的应用程序独立于
QUiLoader加载 UI 文件,并使用QXmlSimpleReader解析它以列出内部所有小部件的动态属性。然后,在 QUiLoader::createWidget() 的覆盖版本中,我根据小部件名称将所有这些动态属性应用于小部件。不幸的是,我不会在这里粘贴整个解决方案,因为它很大。尽管我有解决方法,但最初的问题仍然存在。也许有更好的解决方案。
标签: qt