当前位置:首页 >> 硬件技术 >> 【Qt】QML-02:QQuickView用法,moto me860

【Qt】QML-02:QQuickView用法,moto me860

cpugpu芯片开发光刻机 硬件技术 2
文件名:【Qt】QML-02:QQuickView用法,moto me860 【Qt】QML-02:QQuickView用法 1、先看demo

QtCreator自动生成的工程是使用QQmlApplicationEngine来加载qml文件,下面的demo将使用QQuickView来加载qml文件

#include <QGuiApplication>#include <QtQuick/QQuickView>int main(int argc, char *argv[]){QGuiApplication app(argc, argv);QQuickView view;view.setSource(QUrl(QLatin1String("qrc:/main.qml")));view.setTitle("Hello World");view.show();return app.exec();}

setTitle()和show()这两个接口函数是不是很眼熟,没错QQuickView和QWindow的使用方法很相似,其实QQuickView继承自QQuickWindow,而QQuickWindow就是继承自QWindow

QQuickView加载qml文件使用接口函数:setSource()

2、Window元素在QQuickView中不显示

当修改完mian.cpp后,直接运行时有窗口,但是大小和标题不是qml文件中Windowu元素设置的。 原因是:Window元素在QQuickView中不显示。 需要修改qml文件,修改后的qml文件如下:

import QtQuick 2.15Rectangle {id: rectwidth: 640;height: 480color: "red"}

运行效果如下:

3、Window元素必须用在QQmlApplicationEngine中

QQuickView会自动创建根窗口,QQmlApplicationEngine不会自动创建根窗口,因此在使用QQmlApplicationEngine加载的根qml文件中需要使用Window对象为 Qt Quick 场景创建一个新的顶级窗口。此时,QML 拥有窗口的完整控制权,可以直接设置标题、窗口尺寸等属性。

4、 QQuickWidget和QQuickView的区别

QQuickWidget的继承自QWidget,可以直接添加到Qt布局中; QQuickView继承自QQuickWindow(继承自QWindow),通过转换才能添加到Qt布局中:

QQuickView *view = new QQuickView();QWidget *widget = QWidget::createWindowContainer(view, this);view->setSource(QUrl("qrc:/main.qml")); 5、在QML中使用C++ 5.1 定义C++类

要想在QML中调用C++类,C++类的定义有一定要求 1)声明:Q_OBJECT QML使用的是Qt的元对象系统,因此需要在类开头声明:Q_OBJECT

2)修饰函数:Q_INVOKABLE 使用Q_INVOKABLE修饰的成员函数,才能被Qt元对象系统识别; 否则在调用成员函数时报错

TypeError: Property 'xxx' of object xxx is not a function

3)修改枚举:Q_ENUMS 使用Q_ENUMS修饰的枚举,才能被Qt元对象系统识别;

4)定义属性:Q_PROPERTY

Q_PROPERTY(type nameREAD getFunction[WRITE setFunction][RESET resetFunction][NOTIFY notifySignal][DESIGNABLE bool][SCRIPTABLE bool][STORED bool][USER bool][CONSTANT][FINAL])

例如:Q_PROPERTY(double testValue READ getTestValue WRITE setTestValue)

5)本例中只展示Q_INVOKABLE的用法

class Class2Qml : public QObject{Q_OBJECTpublic:explicit Class2Qml(QObject *parent = nullptr);Q_INVOKABLE void call(const QString &msg);};void Class2Qml::call(const QString &msg){qDebug() << "Class2Qml, msg = " << msg;} 5.2 将C++类引入QML中

使用QQuickView::rootContext()->setContextProperty来引入C++类到QML中

int main(int argc, char *argv[]){QGuiApplication app(argc, argv);Class2Qml c2q;QQuickView view;view.setSource(QUrl(QLatin1String("qrc:/quickView.qml")));view.setTitle("Hello World");view.setResizeMode(QQuickView::SizeRootObjectToView);view.rootContext()->setContextProperty("c2q", &c2q);view.show();return app.exec();} 5.3 在QML中使用C++类

在QML中可以通过使用==类名.成员函数名(参数)==的格式来调用即可,完整的QML代码如下

import QtQuick 2.15import QtQuick.Controls 2.15Rectangle {id: rectwidth: 640;height: 480color: "red"Button {id: btn1width: 50height: 50x:100y:100text:"msg"onClicked: {c2q.call("quickView Rectangle")}}}
协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接