【问题标题】:QUiLoader and ignored dynamic propertiesQUILoader 和忽略的动态属性
【发布时间】: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 次,但没有提供解决方案:

  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 次。

【问题讨论】:

  • 我在最简单的示例项目中对此进行了测试,并确认这与我所做的任何事情都无关(重新实现 createWidget() 或其他任何事情)。这是 QUILoader 中的一个错误。当表单在构建时从 UI 文件生成为 C++ 代码时,动态属性可以正常工作,但在使用 QUiLoader 加载时不能正常工作。
  • 现在我已经实现了一个巨大(而且不是很好)的解决方法,它让我的应用程序独立于QUiLoader 加载 UI 文件,并使用 QXmlSimpleReader 解析它以列出内部所有小部件的动态属性。然后,在 QUiLoader::createWidget() 的覆盖版本中,我根据小部件名称将所有这些动态属性应用于小部件。不幸的是,我不会在这里粘贴整个解决方案,因为它很大。尽管我有解决方法,但最初的问题仍然存在。也许有更好的解决方案。

标签: qt


【解决方案1】:

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

  1. 问题是我试图在QUiLoader::createWidget() 的覆盖方法中访问动态属性,但这是为每个子小部件调用的,并且在创建所有小部件后设置动态属性。在调用createWidget() 时,动态属性尚不可用。

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

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

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2021-04-13
    相关资源
    最近更新 更多