QML新手需要帮助从C ++中访问Item属性

时间:2012-11-07 17:20:55

标签: qt qt4 qml qt-quick

我正在使用QT和QML开发一个应用程序来访问一些XML数据并显示结果。

从C ++下载/解析XML,这很好用。 我有一个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的各个属性即可调用应用程序查看器的findChild<QObject *>方法{ {1}}返回指向rootContext()实例的QObject指针,然后像这样调用mainScreen方法。

setProperty

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"); 在其他地方被定义为

ROOT_CONTEXT
在设置主QML文件后调用

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)

但是...

我遇到的问题是从QmlApplicationViewer viewer; viewer.setMainQmlFile(QLatin1String("main.qml")); viewer.showExpanded(); viewer.createMyApplication(); 返回的值始终为NULL。我尝试使用以下代码

枚举QML文件中的对象层次结构
findChild<QObject *>("mainScreen");

我得到了大约120个项目的列表,但是他们的名字都有一个空白字符串(“”)。

回顾QT文档,所有示例似乎建议手动创建单个部分(即创建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(); } QDeclarativeEngineQDeclarativeComponent的实例)并将它们链接在一起使用QDeclarativeItem类,如此博客条目http://xizhizhu.blogspot.co.uk/2010/10/hybrid-application-using-qml-and-qt-c.html所示,但我更倾向于坚持我已编写的代码。

任何人都可以帮助并建议我出错的地方或指出我可以找到一个“简单”示例的方向,即能够从C ++更改QML文件中的Item的属性。

很多(很多)提前感谢。

...乔恩

2 个答案:

答案 0 :(得分:2)

Main.qml应为

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

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

你错过了objectName:“mainScreen”,这就是findChild&lt;&gt;()找到它的孩子。

答案 1 :(得分:2)

<强>更新

以下代码

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文件中使用objectName:属性时,我可以在我的应用程序中看到(并访问)ROOT项的子项。

然而,我似乎无法做到的实际上是访问ACTUAL ROOT项目并设置它的属性 - 它是我在一个典型的脸部手掌时刻恍然大悟,我已经参与了ROOT OBJECT!这是已经存储在ROOT_OBJECT变量中的值* sheesh *

总结......

以上所有代码都有效 - 要在主视图中实际查找和调整CHILD的属性,请记住设置 objectName: ,如果您想要实际更改属性在根项目中 - 只需使用 QDeclaritiveView::rootObject() 函数返回的值。

再次感谢 IvanFel 指出我正确的方向,希望这会在某个时候出现在搜索中并以与许多stackOverflow条目帮助我的方式相同的方式帮助其他人过去。

8 - )