我正在加载.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。
这一问题以前已经问过/报告过两次,但没有提供任何解决办法:
有什么想法吗?
我已经确定我加载了正确的文件。三次。
发布于 2014-06-13 18:28:43
原来是我的错,Qt工作正常。菜鸟的错误。
QUiLoader::createWidget()的overriden方法中访问动态属性,但这是对每个子小部件调用的,并且在创建所有小部件之后设置了动态属性。动态属性在createWidget()调用时尚不可用。毕竟,QUiLoader可以很好地处理动态属性。
https://stackoverflow.com/questions/24172780
复制相似问题