我正在使用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。我尝试使用以下代码
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();
}
,QDeclarativeEngine
和QDeclarativeComponent
的实例)并将它们链接在一起使用QDeclarativeItem
类,如此博客条目http://xizhizhu.blogspot.co.uk/2010/10/hybrid-application-using-qml-and-qt-c.html所示,但我更倾向于坚持我已编写的代码。
任何人都可以帮助并建议我出错的地方或指出我可以找到一个“简单”示例的方向,即能够从C ++更改QML文件中的Item的属性。
很多(很多)提前感谢。
...乔恩
答案 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 - )