QUiLoader并忽略动态属性

时间:2014-06-11 21:20:42

标签: qt

我正在加载.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。

这个问题之前已经被问过/报告了两次,但没有提供解决方案:

  1. https://bugreports.qt-project.org/browse/QTBUG-11791?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab
  2. http://www.qtcentre.org/threads/32013-QUiLoader-Problem-No-Dynamic-Properties-Support
  3. 有什么想法吗?

    P.S。我已确保加载正确的文件。 3次。

1 个答案:

答案 0 :(得分:0)

原来这是我的错误,Qt工作正常。菜鸟错误。

  1. 问题是我尝试在QUiLoader::createWidget()的override方法中访问动态属性,但是每个子窗口小部件都会调用它,并且在创建所有窗口小部件后设置动态属性。 createWidget()调用时尚未提供动态属性。

  2. 我为测试这个非常简单的项目(我在评论中提到过)也正常工作,我在打印调试信息时犯了一个错误(我是从错误的小部件打印出来的)。就是这样。

  3. 毕竟,QUiLoader可以很好地处理动态属性。