QML和c++(Qt)相互传值

来源:互联网 发布:如何培养英语兴趣 知乎 编辑:程序博客网 时间:2024/05/29 18:50

qml的两种加载方式:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include<QTextCodec>
#include <QQuickView>
#include <QtQml>

QQuickView *view;
int main(int argc,char *argv[])
{
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

    myapplication app(argc, argv);


    view = new QQuickView;
    view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view->show();

// QQmlApplicationEngine engine;
// engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject::connect(view->engine(), SIGNAL(quit()), view, SLOT(close()));

    return app.exec();
}


上面是采用QQuickView的方式(Rectangle加载方式)。这种加载一切正常,启动过程中没有出现白屏现象(此时退出Qt程序需要将QQuickView close掉才行,执行Qt.quit() 会触发QQmlEngine的quit()信号)


QQuickView只是提供一个界面,然后可以在界面添加各种组件,所以显示的时候就是qml加载成功的时候,没成功之前是就是黑的(屏幕原先是什么样还是什么样)。
而QQuickWindow(window)却是为我们提供了一个基于graphical QML scene的窗口,主要是方便scene中的组件(QQuickItems)之间互相interact(交互)。所以在使用的时候,qml还没有加载完毕,scene已经存在,就是我们看到的一片白色。。。


QML和c++(Qt)相互传值


第一种传值过程有两种实现方法

方法1:

1.假设

1.c++中创建一个Person的对象,

2.QML中获取并显示数据

3.c++中改变数据后,显示的数据能进行相应的改变

也就是说我们实际是在c++new一个对象出来,而把这个对象的数据在QML里面进行显示

 

2.具体代码

......




qml页面之间传值及传返回值

qml页面之间传值及传返回值
1.使用qml搞移动开发有一段时间了,不过感觉Qt的帮助文档详细度严重不够,比起MSDN差得远。经常遇到问题不得不借助于网络搜索,网上关于qml开发的资料也比较少。问度娘一般是不行的,得问谷歌或360搜索,因为大部分都是英文搜索,在英文搜索方面,360搜索比百度好用。
2.qml页面之间传值及传返回值的问题,大部分搞qml开发的人都会遇到,特别是传返回值,网上找了个遍也没找到,最后还是自己试出来了。

3.题回正传,直接上代码(以StackView管理页面为例)
(1)page1.qml跳转到page2.qml传值
page1.qml






QML 传值问题
Test1.qml中有个button点击跳转到Test2.qml,代码:

 pageStack.push(Qt.resolvedUrl("Test2.qml"),{"test":"aaaaaaaaaaaaaaaaaaaaa"});

然后在Test2.qml中有个属性

 property string test: ""

在Test2.qml的Component.onCompleted事件中输出 test 属性时 test属性为空

这是什么原因呢 ?

要怎样才能或得到从Test1.qml中传过来的值?

谢谢回复!!


------解决方案--------------------
Component.onCompleted是构造函数,那时对象刚刚创建,的确是没有赋值

想要第一时间得到这个值,应该在page的onStatusChanged中通过观察status的变化来实现。




0 0
原创粉丝点击