我正在 QT 和 QML 中开发一个应用程序来访问一些 XML 数据并显示结果。
XML 是从 C++ 下载/解析的,效果很好。 我有一个 QML 应用程序,旨在显示自定义布局,并且效果也很好。
为了使应用程序看起来更加精美,我在 C++ 端完成初始下载/解析时显示了一个初始“启动屏幕”,我在主 QML View 中创建了一个属性来表示当前应用程序“状态”,因此当数据准备好时,我可以切换到正确的屏幕。
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 *>
应用程序查看器的方法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
在别处定义为
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)
在设置主 QML 文件后调用,即
QmlApplicationViewer viewer;
viewer.setMainQmlFile(QLatin1String("main.qml"));
viewer.showExpanded();
viewer.createMyApplication();
但是...
我遇到的问题是从 findChild<QObject *>("mainScreen");
返回的值始终为 NULL。我尝试使用以下代码枚举 QML 文件中的对象层次结构
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();
}
我得到了大约 120 个项目的列表,但它们的名称都有一个空白字符串 ("")。
回顾 QT 文档,所有示例似乎都建议手动创建各个部分(即创建 QDeclarativeEngine
、 QDeclarativeComponent
和 QDeclarativeItem
的实例)并将它们链接在一起,而不是使用 QApplicationViewer
。类如本博客条目 http://xizhizhu.blogspot.co.uk/2010/10/hybrid-application-using-qml-and-qt-c.html 所示,但我宁愿坚持使用我已经编写的代码。
任何人都可以帮助并建议我哪里出错了,或者为我指明方向,我可以找到一个能够从 C++ 更改 QML 文件中项目属性的“简单”示例。
提前非常感谢。
乔恩...
最佳答案
更新
以下代码
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 Item 的子项。
然而,我似乎无法做的是实际上访问实际根项目并设置它的属性 - 他们在一个典型的手掌时刻让我意识到我已经引用了根对象!这是已经存储在 ROOT_OBJECT 变量中的值 * sheesh *
总而言之...
以上所有代码都有效 - 要在主视图中实际查找和调整 CHILD 的属性,请记住设置 objectName:
,如果您想实际上更改根项中的属性 - 只需使用 QDeclaritiveView::rootObject()
函数返回的值。
再次感谢 IvanFel 为我指明了正确的方向,希望这会在某个时候出现在搜索中,并以与许多 stackOverflow 条目帮助我相同的方式帮助其他人过去。
8-)
关于qt - QML 新手需要帮助从 C++ 中访问 Item 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13274844/