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
);
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
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
: {
console
.log("name: "+name
+", type: "+type
);
radioplayer
.enterWork(name
, type
);
}
}
}
三. 状态
state
: "normal"
states
: [
State
{
name
: "normal"
changeState("normal")
},
State
{
name
: "sleep"
changeState("sleep")
},
State
{
name
: "idle"
changeState("idle")
}
]
通过给上面的 state赋值为 normal, sleep, idle 来切换不同的状态