2012-11-07 1 views
2

QT 및 QML로 응용 프로그램을 개발하여 일부 XML 데이터에 액세스하고 결과를 표시합니다.CML 내에서 항목 속성에 액세스하는 데 도움이 필요한 QML 초보자

XML은 C++에서 다운로드/구문 분석되며 정상적으로 작동합니다. 사용자 정의 레이아웃을 표시하도록 설계된 QML 응용 프로그램이 있고 그 또한 잘 작동합니다.

응용 프로그램을 좀 더 세련되게 보이게하려면 C++ 측에서 초기 다운로드/구문 분석을 완료하는 동안 표시되는 초기 "스플래시 화면"이 있고 현재 QML 뷰 내부의 속성을 만들어 현재 응용 프로그램 "상태"를 나타냅니다. 그래서 데이터가 준비되면 올바른 화면으로 바꿀 수 있습니다.

Main.qml

Item 
{ 
    id: mainScreen 
    width: 800; height: 600; 
    property int activeState: 0  // This controls what screen is displayed 

    Item 
    { 
     // screen layout .. removed .. 
    } 
} 

는 C++ 코드는 QT 만든 응용 프로그램 마법사에서 생성되고 기본 QmlApplicationViewer 클래스를 기반으로한다.

내가 읽은 (다시는 읽기) 온라인 QT의 문서를하고 기발한 내가 mainScreen가의 개별 속성에 액세스해야하는 모두가에 QObject 포인터를 반환하는 응용 프로그램 시청자 rootContext()findChild<QObject *> 메소드를 호출 mainScreen 인스턴스를 호출 한 다음 setProperty 메서드를 호출하십시오. 주요 QML 파일 설정을 즉

QmlApplicationViewer viewer; 

viewer.setMainQmlFile(QLatin1String("main.qml")); 
viewer.showExpanded(); 
viewer.createMyApplication(); 

하지만 ...

문제가 된 후 ROOT_CONTEXT

QDeclarativeContext *ROOT_CONTEXT; 
QDeclarativeEngine *ROOT_ENGINE; 
QGraphicsObject  *ROOT_OBJECT; 

void QmlApplicationViewer::createMyApplication(void) 
{ 
    ROOT_CONTEXT = this->rootContext(); 
    ROOT_OBJECT = this->rootObject(); 
    ROOT_ENGINE = this->engine(); 

    pMyApplication = new MyApplication(this); 
} 

void QmlApplicationViewer::createMyApplication(void)로 다른 곳에서 정의됩니다

QObject *mainView = ROOT_CONTEXT->findChild<QObject *>("mainScreen"); 

qDebug("mainView = %08X",(uint)mainView); 

if(mainView) 
{ 
    mainView->setProperty("activeState",1); 
} 
else 
    qDebug("Unable to find the mainScreen QML object"); 

가 호출된다 나는 그 값이에서 반환된다는 것입니다.은 항상 NULL입니다. 다음 코드

QList<QObject*> list = ROOT_OBJECT->findChildren<QObject*>(); 

qDebug("list = %d",list.count()); 
int i; 

for(i=0;i<list.count();i++) 
{ 
    QObject *obj = list[i]; 

    qDebug() << "Object" << i << obj->objectName(); 
} 

를 사용하여 내 QML 파일에서 객체의 계층 구조를 통해 열거 시도하고 나는 ~ 120 항목의 목록을 얻을 수 있지만, 그들은 모두 자신의 이름에 대한 빈 문자열 ("")이있다. 이 블로그 항목에 같이 QT의 문서를 다시 찾고

모든 예제 (즉 QDeclarativeEngine, QDeclarativeComponentQDeclarativeItem의 인스턴스를 생성)과 QApplicationViewer 클래스를 사용하는 대신 그들을 함께 연결 손으로 개별 부품을 만드는 제안하는 것 http://xizhizhu.blogspot.co.uk/2010/10/hybrid-application-using-qml-and-qt-c.html, 그러나 나는 오히려 내가 이미 작성한 코드를 고수하고 싶다.

아무도 도와 줄 수 있고 내가 잘못 가고있는 곳을 제안하거나 C++에서 QML 파일의 Item 속성을 변경할 수있는 "간단한"예제를 찾을 수있는 방향으로 나를 가리킬 수 있습니까?

많은 분들께 미리 감사드립니다.

존 ...

답변

1

홈페이지.QML은해야

Item 
{ 
    id: mainScreen 
    objectName: "mainScreen" 
    width: 800; height: 600; 
    property int activeState: 0  // This controls what screen is displayed 

    Item 
    { 
     // screen layout .. removed .. 
    } 
} 

당신은 개체 이름이 누락되었습니다 : "mainScreen를"그게 아이들의 방법 findChild <>() 발견합니다.

+0

감사합니다, 나는 그 속성을 필요 했어 방법을 볼 수 있습니다 (I은 문서의 해당 섹션을 놓쳤다). 그러나 나는 여전히 NULL을 얻고 있습니다. 다시 돌아가서 조심스럽게 코드를 작성해야 제가 다른 것을 놓치지 않았는지 확인할 수 있습니다. FWIW - 루트 항목에 액세스하려고 시도했습니다. 루트 항목의 하위 요소에 액세스하려고 시도하면 작동하는지 궁금합니다. 도와 줘서 고마워. 8-) – Techdojo

+0

@Techdojo 답변이 도움이된다면, 받아 들여야합니다. [FAQ] (http://stackoverflow.com/faq#howtoask)를보십시오. –

+0

수락 - 아래의주의 사항을 참조하십시오! – Techdojo

2

UPDATE

다음 코드

QList<QObject*> list = ROOT_OBJECT->findChildren<QObject*>(); 

qDebug("list = %d",list.count()); 
int i; 

for(i=0;i<list.count();i++) 
{ 
    QObject *obj = list[i]; 
    qDebug() << "Object" << i << obj->objectName(); 
} 

작품을하고 개체의 목록을 덤프 내가 ObjectName를 사용할 때 : 내 QML 파일에 속성을 내가 볼 수 위에서 언급 한 (액세스로) 응용 프로그램에서 ROOT 항목의 하위 항목.

그러나 내가 할 수없는 것은 실제로 ACTUAL ROOT 항목에 액세스하여 속성을 설정하는 것입니다. 일반적인 얼굴 손바닥 순간에 나에게 그걸 가져다주었습니다. 내가 이미 루트 객체를 참조했습니다! 그것은 ... 값이 이미 ROOT_OBJECT 변수 * 요약 *

그래서 쳇에 저장된의

위의 코드는 모두 작동 - 실제로 아동 오프 기본보기의 속성을 찾아 조정 루트 항목의 속성을 실제로 변경하려면 objectName:을 설정해야합니다. QDeclaritiveView::rootObject() 함수가 반환 한 값을 사용하면됩니다.

다시 한번 감사 올바른 방향으로 날을 가리키는위한 IvanFel에, 희망이 언젠가 검색에 표시 및 유래 항목의 많은 과거에 나에게 도움이 것과 같은 방식으로 다른 사람을 도움이 될 것입니다. 다시 나는 예를 QML 파일에 나열된 속성을 볼 수있는 다시 찾고 -

8) 조언을