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 来切换不同的状态