一、类的声明
定义一个map.h的头文件
注意:
1.必须要继承基类QObject //为了重载paint函数,我继承QQuickPaintedItem
2.必须要有声明Q_OBJECT
3.被调用函数需要声明Q_INVOKABLE
4.类的构造函数
5. 如果在vs下编译需要配置map.h的属性(使用moc编译),否则报错,解决方法见链接
//map.h
#ifndef MAP
#define MAP
#include <QQuickPaintedItem>
#include <QPainterPath>
#include <QPainter>
#include <QPointF>
#include <QImage>
#include <QPen>
#include <QBrush>
#include <QColor>
#include <QDebug>
using namespace std;
class CMap :public QQuickPaintedItem
{
Q_OBJECT
private:
public:
Q_INVOKABLE void init();
void paint(QPainter *painter);
public:
CMap(QQuickItem *parent = 0);
~CMap(){}
};
#endif
二、类的定义
1. init()函数提供qml的调用
2. update()函数用来重新绘制
3.paint()重载的paint函数
//map.cpp
#include "map.h"
CMap::CMap(QQuickItem *parent ) :QQuickPaintedItem(parent)
{
}
void CMap::init()
{
update();
}
void CMap::paint(QPainter *painter)
{
QImage imgWater("hj2.png");
painter->drawImage(QRectF(i*10,j*10,20,20), imgWater);
}
三、 类的注册
1. 引用头文件map.h
2. 写入注册代码:qmlRegisterType<CMap>("an_qt_map", 1, 0, "QMLCMap");
注意:a.放在aml调用之前; b.QMLCMap首字母必须大小,否则无法识别
//main.cpp
#include "qtquick2applicationviewer.h"
#include <QtGui/QGuiApplication>
#include "map.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<CMap>("an_qt_map", 1, 0, "QMLCMap");
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("main.qml"));
viewer.showExpanded();
return app.exec();
}
四、 类的调用
1. 引入类:import an_qt_map 1.0
2. 声明类:
注意:必须定义范围,否则无法响应paint()函数
3. 类的调用
使用id进行调用:painter.init();
//main.qml
import QtQuick 2.0
import an_qt_map 1.0
Rectangle {
width: 800
height: 600
QMLCMap{
id: painter
anchors.fill: parent
}//使用范围
MouseArea {
anchors.fill: parent
onClicked: {
painter.init();//调用init()函数
Qt.quit();
}
}
}