Qt案例1-extending-qml

chapter1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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分别添加到此矩形的现有坐标。

chapter2

1 定义方法提供qml使用:

  Q_INVOKABLE void clearChart();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRNxmI0U-1637966701556)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20211126091049109.png)]

chapter3

1 属性绑定

   PieChart {
            id: chartA
            width: 100; height: 100
            color: "red"
        }

        PieChart {
            id: chartB
            width: 100; height: 100
            color: chartA.color
        }

chapter 4

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


chapter5

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属性仍然有效。
空指针可以传递给任何函数。如果传入任何空指针,则调试器既不能设计也不能修改列表。建议为所有函数提供有效的指针。
函数模板通过<>里的参数进行实例化。

chapter6

插件, 将自定义的模块。编译成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


你可能感兴趣的:(程序人生,qt,开发语言)