2014-06-11 2 views
1

위젯 (QComboBox) 중 하나에 동적 속성 (http://qt-project.org/doc/qt-5/properties.html#dynamic-properties)이있는 .ui 파일이로드됩니다. UI를 파일은 다음과 같다 :QUiLoader 및 동적 속성 무시

<?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() 방법에 : 동적 속성이 completly 무시됩니다 것 같다 있도록

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를 인식합니다.

이 질문에

이미 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

어떤 아이디어?

P. 올바른 파일을로드했는지 확인했습니다. 3 번.

+0

가장 간단한 예제 프로젝트에서이 작업을 테스트했지만이 작업은 내가 한 일 (createWidget() 또는 다른 것을 다시 구현)과 관련이 없음을 확인합니다. 이것은 QUiLoader의 버그입니다. 빌드시 UI 파일에서 C++ 코드로 양식을 생성 할 때 동적 속성이 올바르게 작동하지만 QUiLoader로로드 할 때 올바르게 작동하지 않습니다. – Googie

+0

지금까지는 내 애플리케이션이 'QUiLoader'와는 별도로 UI 파일을로드하고'QXmlSimpleReader '로 파싱하여 내부의 모든 위젯에 대한 동적 속성 목록을 작성하는 방대한 해결책을 구현했습니다. 그런 다음, 재정의 된 버전의 QUiLoader :: createWidget()에서 모든 동적 속성을 위젯 이름에 기반한 위젯에 적용합니다. 불행히도 전체 솔루션을 여기에 붙여 넣지는 않을 것입니다. 내 해결 방법에도 불구하고, 원래의 질문이 남아 있습니다. 어쩌면 더 나은 해결책이있을 수 있습니다. – Googie

답변

0

내 실수 였고 Qt가 올바르게 작동하고 있습니다. 신기한 실수.

  1. 문제가 I QUiLoader::createWidget() 재정의의 방법으로 동적 속성을 액세스하려한다는이지만, 이것은 각는 SubWidget 위해 호출되고 모든 위젯이 생성 된 후에 동적 특성이 설정된다. 동적 속성은 createWidget() 호출 순간에는 아직 사용할 수 없습니다.

  2. 내가 테스트 한 매우 간단한 프로젝트 (주석에서 언급 했음)도 올바르게 작동하고 있었으며 디버그 정보를 인쇄하는 동안 실수로 작업을했습니다 (잘못된 위젯에서 인쇄하고있었습니다). 그게 다야.

결국 QUiLoader는 동적 속성과 잘 맞습니다.