我正在加载.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编辑器会识别此动态属性correclty。
这个问题之前已经被问过/报告了两次,但没有提供解决方案:
答案 0 :(得分:0)
原来这是我的错误,Qt工作正常。菜鸟错误。
问题是我尝试在QUiLoader::createWidget()
的override方法中访问动态属性,但是每个子窗口小部件都会调用它,并且在创建所有窗口小部件后设置动态属性。 createWidget()
调用时尚未提供动态属性。
我为测试这个非常简单的项目(我在评论中提到过)也正常工作,我在打印调试信息时犯了一个错误(我是从错误的小部件打印出来的)。就是这样。
毕竟,QUiLoader可以很好地处理动态属性。