Qt qml相关语法规则和易忘知识点总结(不断更新)

tech2022-09-12  102

Qt qml相关

Qml中的易忘知识点一. Qml中基本数据类型二. Qml与C++类的交互1. 条件2. 步骤3. 使用4. 末尾 三. 状态

Qml中的易忘知识点

一. Qml中基本数据类型

bool: 布尔类型int: 整型,不费话了string:字符串类型real: 在arm平台上是float,在其他平台上等同于doubledouble: 双精度浮点color: 颜色 color.r: 代表红色分 color.g: 代表绿色分量 color.b: 代表蓝色分量 color.a: 代表透明度分量 color的赋值: 1> property color mainColor: Qt.rgba(1,1,1,1): 根据rgba分量构造颜色变量,4个参数值范围0~1 2> color: “#FF0000” // rgb 3> color: “#800000FF” // argbpoint: 坐标 point.x: x坐标分量 point.y: y坐标分量 赋值:myPointProperty: Qt.point(0, 20)size: 尺寸 size.width: 尺寸宽度 size.height: 尺寸高度 赋值:Qt.size(150, 50)rect: 矩形 rect.x: 矩形左上角x坐标 rect.y: 矩形左上角y坐标 rect.width: 矩形宽度 rect.height: 矩形高度 赋值:Qt.rect(10, 10, 10, 10)date: 日期 赋值:MyDatePicker { minDate: “2000-01-01”; maxDate: “2020-12-31” }font: 字体 string font.family bool font.bold bool font.italic bool font.underline real font.pointSize int font.pixelSizelist: 列表 赋值:  states: [ State { name: “activated” }, State { name: “deactivated” } ] states.length: 列表长度 states[2]: 用中括号带索引号来访问列表里面的元素

二. Qml与C++类的交互

1. 条件

把C++中的类导入Qml, 这个类需要直接或间接继承自QObject这个类需要含有 Q_OBJECT 声明

2. 步骤

在C++入口函数里面调用 qmlRegisterType(“hello.world.RadioPlayer”, 1, 0, “RadioPlayer”); 来向qml声明C++类在Qml中 import hello.world.RadioPlayer 1.0 之后就可以使用 “RadioPlayer” 标签了,qmlRegisterType函数的模板类对应要声明的C++类,前三个参数是对应Qml中的import 包名称和版本信息,第四个参数是C++类在Qml中的标签名称

3. 使用

qml调用C++中的函数,C++中对应的函数前面需要添加声明 Q_INVOKABLEC++调用Qml中的函数,可以变相的通过Qml实现C++中的信号来实现,C++中声明为 signals: void startWork(QString name, int type);

qml中:

Rectangle { RadioPlayer { onStartWork: { } } }

onStartWork对应C++中的 startWork 信号

4. 末尾

C++相关代码

#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include "radioplayer.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // 将RadioPlayer类导入Qml体系中 qmlRegisterType<RadioPlayer>("hello.world.RadioPlayer", 1, 0, "RadioPlayer"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); } class RadioPlayer : public QObject { Q_OBJECT // 在Qml中访问枚举类型,需要用Q_ENUMS来声明枚举类型 Q_ENUMS(WorkState) public: enum WorkState { normal = 0, sleep, work, idle }; explicit RadioPlayer(QObject *parent = nullptr); ~RadioPlayer(); signals: void startWork(QString name, int type); void endWork(QString name); void pause(void); void idle(bool auto); void currentState(WorkState state); public slots: Q_INVOKABLE void enterWork(QString name, int type); }

Qml相关代码

import hello.world.RadioPlayer 1.0 Rectangle { RadioPlayer { id: radioplayer // 这个onStartWork对应C++类中的信号 startWork(QString name, int type) onStartWork: { console.log("name: "+name+", type: "+type); // 调用C++类中用Q_INVOKABLE声明的方法 radioplayer.enterWork(name, type); } } }

三. 状态

// 默认状态为“normal” state: "normal" states: [ State { name: "normal" changeState("normal") }, State { name: "sleep" changeState("sleep") }, State { name: "idle" changeState("idle") } ]

通过给上面的 state赋值为 normal, sleep, idle 来切换不同的状态

最新回复(0)