[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1MGVR5e-1637966701553)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20211126065149983.png)]
知识点:
1 注册自定义组件。
qmlRegisterType("Charts", 1, 0, "PieChart");
这个模板函数在QML系统中注册C++类型。无法从QML系统创建此类型的实例。当类型不被名称引用时,应使用此函数。具体地说,它必须用于C++绑定类型,这些类型用作属性绑定的左侧。
2 声明属性
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QColor color READ color WRITE setColor)
此宏用于在继承QObject的类中声明属性。属性的行为类似于类数据成员,但它们具有可通过元对象系统访问的附加功能。
3 画图
QPen pen(m_color, 2);
painter->setPen(pen);
painter->setRenderHints(QPainter::Antialiasing, true);
painter->drawPie(boundingRect().adjusted(1, 1, -1, -1), 90 * 16, 290 * 16); // 画一个扇形
绘制由给定矩形、星形缠结和展角定义的饼图。
返回一个新矩形,其中dx1、dy1、dx2和dy2分别添加到此矩形的现有坐标。
1 定义方法提供qml使用:
Q_INVOKABLE void clearChart();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRNxmI0U-1637966701556)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20211126091049109.png)]
1 属性绑定
PieChart {
id: chartA
width: 100; height: 100
color: "red"
}
PieChart {
id: chartB
width: 100; height: 100
color: chartA.color
}
1 自定义可视化项
#ifndef PIECHART_H
#define PIECHART_H
#include
class PieSlice; // 前置声明
// QQuickItem类提供了Qt Quick中最基本的可视化项
class PieChart : public QQuickItem
{
Q_OBJECT
Q_PROPERTY(PieSlice* pieSlice READ pieSlice WRITE setPieSlice)
Q_PROPERTY(QString name READ name WRITE setName)
public:
PieChart(QQuickItem *parent = 0);
QString name() const;
void setName(const QString &name);
PieSlice *pieSlice() const; // 返回 属性PieSlice
void setPieSlice(PieSlice *pieSlice); // 设置属性
private:
QString m_name;
PieSlice *m_pieSlice;
};
#endif
2 自定义可视化项 属性
#include
#include
// QQuickPaintedItem类提供了一种在QML场景图中使用QPainter API的方法。
class PieSlice : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor)
Q_PROPERTY(int fromAngle READ fromAngle WRITE setFromAngle)
Q_PROPERTY(int angleSpan READ angleSpan WRITE setAngleSpan)
public:
PieSlice(QQuickItem *parent = 0); // 构造函数
QColor color() const;
void setColor(const QColor &color);
void paint(QPainter *painter);
private:
QColor m_color;
};
#endif
1 列表元素
#ifndef PIESLICE_H
#define PIESLICE_H
#include
#include
class PieSlice : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor)
Q_PROPERTY(int fromAngle READ fromAngle WRITE setFromAngle)
Q_PROPERTY(int angleSpan READ angleSpan WRITE setAngleSpan)
public:
PieSlice(QQuickItem *parent = 0);
QColor color() const; // 读取颜色
void setColor(const QColor &color); // 设置颜色
int fromAngle() const; // 开始角度
void setFromAngle(int angle); // 设置开始角度
int angleSpan() const; // 角度
void setAngleSpan(int span);
void paint(QPainter *painter); // 画图
private:
QColor m_color;
int m_fromAngle; // 开始角度
int m_angleSpan; // 分割
};
#endif
2 定义列表属性
class PieChart : public QQuickItem // 定义一个类,继承
{
Q_OBJECT
// QQmlListProperty类允许应用程序向QML公开qobject -派生类的listtype属性
Q_PROPERTY(QQmlListProperty slices READ slices)
Q_PROPERTY(QString name READ name WRITE setName)
public:
PieChart(QQuickItem *parent = 0);
QString name() const; // 组件的名字属性
void setName(const QString &name);
QQmlListProperty slices(); // 返回列表属性
private:
// 类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
static void append_slice(QQmlListProperty *list, PieSlice *slice); // 添加属性的方法
QString m_name;
QList m_slices; //
};
#endif
/**
* @brief PieChart::slices
* @return 一个列表
*/
QQmlListProperty PieChart::slices()
{
//QQmlListProperty类允许应用程序向QML公开qobject派生类的类似列表的属性.
return QQmlListProperty(this, nullptr, &PieChart::append_slice, nullptr, nullptr, nullptr);
}
/**
* @brief PieChart::append_slice
* @param list
* @param slice
*/
void PieChart::append_slice(QQmlListProperty *list, PieSlice *slice)
{
PieChart *chart = qobject_cast(list->object); // qobject_cast()动态转换QObject类的类型。
if (chart) {
slice->setParentItem(chart); // 设置父对象
chart->m_slices.append(slice); // 列表添加对象
}
}
QQmlListProperty(QObject *object, void *data, QQmlListProperty::AppendFunction append, QQmlListProperty::CountFunction count, QQmlListProperty::AtFunction at, QQmlListProperty::ClearFunction clear)
从一组操作函数append、count、at和clear构造QQmlListProperty。可以传递一个不透明的数据句柄,可以从操作函数内部访问它。对象存在时,list属性仍然有效。
空指针可以传递给任何函数。如果传入任何空指针,则调试器既不能设计也不能修改列表。建议为所有函数提供有效的指针。
函数模板通过<>里的参数进行实例化。
插件, 将自定义的模块。编译成qml组件包。
#ifndef CHARTSPLUGIN_H
#define CHARTSPLUGIN_H
#include
// QQmlExtensionPlugin类为自定义QML扩展插件提供了一个抽象基础。
class ChartsPlugin : public QQmlExtensionPlugin // 定义一个类型, 继承QQmlExtensionPlugin
{
Q_OBJECT
//这个宏导入名为PluginName的插件,它对应于使用Q_PLUGIN_METADATA()声明插件元数据的类的名称。
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
void registerTypes(const char *uri); // 提供方法,注册类型
};
#endif
#include "chartsplugin.h"
#include "piechart.h"
#include "pieslice.h"
#include
void ChartsPlugin::registerTypes(const char *uri)
{
qmlRegisterType(uri, 1, 0, "PieChart"); // 注册类型列表属性
qmlRegisterType(uri, 1, 0, "PieSlice"); // 元件类
}
qmldir文件夹
module Charts // 模块名称
plugin chartsplugin // 插件名称
pro文件
TEMPLATE = lib # 模板
CONFIG += plugin # 配置
QT += qml quick
DESTDIR = ../Charts # 生成文件路径
TARGET = $$qtLibraryTarget(chartsplugin)
HEADERS += piechart.h \
pieslice.h \
chartsplugin.h
SOURCES += piechart.cpp \
pieslice.cpp \
chartsplugin.cpp
DESTPATH=$$[QT_INSTALL_EXAMPLES]/qml/tutorials/extending-qml/chapter6-plugins/Charts
target.path=$$DESTPATH
qmldir.files=$$PWD/qmldir
qmldir.path=$$DESTPATH
INSTALLS += target qmldir
CONFIG += install_ok # Do not cargo-cult this!
OTHER_FILES += qmldir
cpqmldir.files = qmldir
cpqmldir.path = $$DESTDIR
COPIES += cpqmldir # 拷贝文件
插件类
#include "chartsplugin.h"
#include "piechart.h"
#include "pieslice.h"
#include
void ChartsPlugin::registerTypes(const char *uri)
{
qmlRegisterType(uri, 1, 0, "PieChart"); // 注册类型
qmlRegisterType(uri, 1, 0, "PieSlice"); // 注册类型名
}
#ifndef CHARTSPLUGIN_H
#define CHARTSPLUGIN_H
#include
// QQmlExtensionPlugin类为自定义QML扩展插件提供了一个抽象基础。
class ChartsPlugin : public QQmlExtensionPlugin // 定义一个类型, 继承QQmlExtensionPlugin
{
Q_OBJECT
//这个宏导入名为PluginName的插件,它对应于使用Q_PLUGIN_METADATA()声明插件元数据的类的名称。
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
void registerTypes(const char *uri); // 提供方法,注册类型
};
#endif
QQmlExtensionPlugin类为自定义QML扩展插件提供了一个抽象基础。
class ChartsPlugin : public QQmlExtensionPlugin // 定义一个类型, 继承QQmlExtensionPlugin
{
Q_OBJECT
//这个宏导入名为PluginName的插件,它对应于使用Q_PLUGIN_METADATA()声明插件元数据的类的名称。
Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
void registerTypes(const char *uri); // 提供方法,注册类型
};
#endif