QML笔记(一):QML与C++混合编程

1、什么是Qt Quick与QML
Qt Quick是Qt User Interface Creation Kit的缩写。
QML是Qt Meta-Object Language的缩写,是基于JavaScript的陈述性语言,也是Qt Quick最重要的组成部分。
通过Qt Creator可以创建一个Qt Quick的应用工程,该工程为QML生成一个应用程序框架。也就是说不需要调用QML Viewer解释器来运行QML文件
Qt Quick包含一个组件集合,大部分用于图形界面。同时也包含一个用于管理组件并与组件交互的C++ API——QtDeclarative模块,用于QML与C++之间的桥梁。
C++与QML的交互通过向QML注册C++对象实现,其中C++实现中,非可视化的类均为QObject的子类,可是化的类型均为QDeclarativeItem的子类,而QDeclarativeItem等同于QML的Item类

2、实现QML与C++编程的步骤
1)定义并实现派生于QObject或QDeclarativeItem的子类,作为新定义的item的实体对象
2)在C++代码中,将1)中新定义的C++类注册给QML(作为某个组件类的一个新的item对象)
3)在QML中,导入包含1)中新定义的C++类的item
4)在QML中,使用包含新定义的C++类的新的item

3、实例
3.1 首先从main函数说起
#include
#include “qmlapplicationviewer.h”
#include
#include <qdeclarative.h> //这个头文件是必须的,包含了下面要调用的qmlRegisterType函数
#include “piechart.h”

Q_DECL_EXPORT int main(int argc, char *argv)
{
QScopedPointer app(createApplication(argc, argv));

QmlApplicationViewer viewer;

// PieChart是与QML中MyButton相对应的C++实现的类名称
// MyButton是将在QML中自定义的一个组件,MyItems是MyButton所属的模块名称, “1,0”是版本信息。
// MyItems也是自定义的
qmlRegisterType(“MyItems”, 1, 0, “MyButton”);

viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String(“qml/mypie2/main.qml”));
viewer.showExpanded();

return app->exec();
}

3.2 创建一个C++类:PieChart
必须从QObject类或QDeclarativeView类派生
• 定义属性:name和color在QML文件中使用,m_name和m_color在C++中使用
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QColor color READ color WRITE setColor)
• 定义属性的访问函数
QString name() const;
void setName(const QString &name);
QColor color() const;
void setColor(const QColor &color);
• 定义绘制函数
void PieChart::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
QPen pen(m_color, 2);
painter->setPen(pen);
painter->setRenderHints(QPainter::Antialiasing, true);
painter->drawPie(boundingRect(), 90 * 16, 290 * 16);
}

3.3 编辑QML文件
import QtQuick 1.1
import MyItems 1.0
Item {
width: 300; height: 200
MyButton {
width: 100; height: 100
name: “A simple pie chart”
color: “red”
}
}

总结:利用上述方法可以扩充QML的组件,可在QML中绘制一些特殊的图形。

最近也在看QML和C++的东西,使用C++扩展qml确实可以很好地实现前端界面和后端逻辑的分离,PS,在Qt5中编写qml的扩展现在要使用QQuickItem这个类了