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

标签 qt qt4 qml qt-quick

我正在 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 文档,所有示例似乎都建议手动创建各个部分(即创建 QDeclarativeEngineQDeclarativeComponentQDeclarativeItem 的实例)并将它们链接在一起,而不是使用 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/

相关文章:

c++ - 可能的 Qt5 错误 : calling setFixedSize() disables the main window's close button (under Win7)

Qt-Right click mouseReleaseEvents 不会被 eventfilter 捕获,但会捕获其他事件

linux - 在没有 OpenGL 的情况下,在 X11 上的 QT 中显示图像的最快方法是什么?

xcode - 让 QMake 生成正确的 .app

c++ - 使用 QGraphicsWebView 比使用 QWebView 有什么优势?

qt - 类 QWebView; 之间有什么区别?与#include <QWebView>

qt - moc 中的宏扩展

c++ - Q_GADGET 与用于从 QML 操作 C++ 对象的多态树的访问器对象

c++ - QQuickView : handling mouse events in C++

c++ - 如何在 QML VideoItem 中包含 gstreamer 接收器?