Qt5官方demo解析集15——Chapter 1: Creating a New Type

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873

前面我们说到了QML的粒子系统,它可以创造丰富多彩的粒子特效。但是更多的情况下,我们的QML界面是配合C++进行工作的:QML负责界面渲染,C++负责逻辑事务。甚至有时,我们还会利用QML来绘制C++代码中定义的可视化组件,或者使用C++代码来访问QML中对象的属性等。从这篇博文开始,我们介绍了Qt官方Demo中的“Chapter”系列,它介绍了在QML文件中使用一个C++类的方法。接下来,我们会介绍Extending
QML系列,它则向我们展示了如何使用C++代码访问QML对象。

OK,接下来先看Chapter的第一个demo:Creating a New Type

先看下工程目录:

可以看到,在这个工程中有一个自定义的piechart类,它继承自QQuickPaintedItem,并定义了自己的绘制效果。在main函数中我们将这个PieChart类注册为一个qml类型,并赋予其一个命名空间"Charts"。qml文件放在资源文件中,名为app.qml,在这个文件里我们使用了这个piechart,并绘制在我们的窗口上。

首先来看piechart.h:

#ifndef PIECHART_H
#define PIECHART_H

//![0]
#include <QtQuick/QQuickPaintedItem>
#include <QColor>

class PieChart : public QQuickPaintedItem // 为了基于QPainter API实现自定义的绘制效果,我们需要继承这个类。如果不需要使用QPainter API,我们可以继承QQuickItem,甚至如果连可视化也不需要,QObject以及它的子类都可以作为我们继承的对象
{
    Q_OBJECT                              // 因为需要使用到Qt的元对象系统
    Q_PROPERTY(QString name READ name WRITE setName)      // 注册两个自定义属性
    Q_PROPERTY(QColor color READ color WRITE setColor)

public:
    PieChart(QQuickItem *parent = 0);     // 作为可视化组件我们需要将其父对象设置为QQuickItem

    QString name() const;                 // 定义属性的读写函数
    void setName(const QString &name);

    QColor color() const;
    void setColor(const QColor &color);

    void paint(QPainter *painter);         // 最后我们重载QQuickPaintedItem的paint函数,实现我们的自定义绘图

private:
    QString m_name;
    QColor m_color;
};
//![0]

#endif

实现代码如下piechart.cpp:

#include "piechart.h"
#include <QPainter>

//![0]
PieChart::PieChart(QQuickItem *parent)
    : QQuickPaintedItem(parent)
{
}
//![0]

QString PieChart::name() const
{
    return m_name;
}

void PieChart::setName(const QString &name)
{
    m_name = name;
}

QColor PieChart::color() const
{
    return m_color;
}

void PieChart::setColor(const QColor &color)
{
    m_color = color;
}

//![1]
void PieChart::paint(QPainter *painter)
{
    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); // 饼状图在矩形范围内的位置与角度。角度的精度为1/16度。
}
//![1]

接下来,我们需要将这个类注册为QML类型main.cpp:

#include "piechart.h"
#include <QtQuick/QQuickView>
#include <QGuiApplication>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<PieChart>("Charts", 1, 0, "PieChart"); // 我们使用模板函数注册了这个类型,"Charts"为import的命名空间,PieChart为类型名,1,0即是版本号1.0。

    QQuickView view;                                  // 然后创建一个QQuickView来显示QML组件
    view.setResizeMode(QQuickView::SizeRootObjectToView);      // 窗口大小设置为根目录大小
    view.setSource(QUrl("qrc:///app.qml"));                    // 调用资源中的app.qml
    view.show();
    return app.exec();
}

最后就是我们的QML文件了app.qml:

import Charts 1.0              // 首先我们引入上面定义的命名空间
import QtQuick 2.0

Item {
    width: 300; height: 200

    PieChart {                 // 接着我们就可以使用"PieChart"这个类型
        id: aPieChart
        anchors.centerIn: parent
        width: 100; height: 100
        name: "A simple pie chart"
        color: "red"          // color属性会与QColor类型自动对应起来,很多属性有这种对应关系
    }

    Text {                   // 然后再定义一个Text来显示PieChart的name属性的值
        anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 }
        text: aPieChart.name
    }
}

最后我们运行,这个PieChart就被绘制出来了~

Qt5官方demo解析集15——Chapter 1: Creating a New Type,布布扣,bubuko.com

时间: 2024-12-15 01:50:16

Qt5官方demo解析集15——Chapter 1: Creating a New Type的相关文章

Qt5官方demo解析集16——Chapter 2: Connecting to C++ Methods and Signals

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集15--Chapter 1: Creating a New Type 在上篇博文我们了解到如何在C++代码中将一个C++类注册为一个QML类型,并供QML文件使用.接下来这个Demo中进一步向这个PieChart中添加信号和方法供QML使用. 在项目上没有什么改变,我们直接来看代码PieChart.h: #ifndef P

Qt5官方demo解析集17——Chapter 3: Adding Property Bindings

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集16--Chapter 2: Connecting to C++ Methods and Signals 在C++中我们通常将用户的交互与处理函数用信号槽绑定起来,比如窗口尺寸的变化,颜色的变化等,但在QML中,我们更多的使用属性绑定来完成这些功能.我们可以将这个属性值绑定到另一个对象或者本身的属性值上,这样当后者改变时,

Qt5官方demo解析集18——Chapter 4: Using Custom Property Types

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集17--Chapter 3: Adding Property Bindings 在前面的"饼状图"Demo中,我们为这个自定义类型定义了"name"和"color"属性,他们都是基于Qt内置类型"QString"和"QColor",这

Qt5官方demo解析集19——Chapter 5: Using List Property Types

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集18--Chapter 4: Using Custom Property Types 上个例子向我们展示了如何为QML调用的C++类型添加自定义类型的属性,在这个例子中我们更进一步,将这个类型更换为一个PieSlice的列表,以此得到更丰富的处理能力. 项目文件与上个例子是一样的. 还是先看看piechart.h: #if

Qt5官方demo解析集20——Chapter 6: Writing an Extension Plugin

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集19--Chapter 5: Using List Property Types 在前文中我们定义的PieChart和PieSlice这两个自定义QML类型只用来供app.qml文件使用,如果希望我们所定义的类型可以被多个qml使用,那么可以将其创建为可扩展的插件.由于是将C++定义的类创建为供QML使用的插件,所以这与我

Qt5官方demo解析集30——Extending QML - Binding Example

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集29--Extending QML - Property Value Source Example 还记得我们曾经在Qt5官方demo解析集17--Chapter 3: Adding Property Bindings一文中接触过QML自定义类型的属性绑定吗?如果不记得了,可以移步进行了解.因为项目尺寸的原因,那个例子可能

Qt5官方demo解析集28——Extending QML - Signal Support Example

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集27--Extending QML - Attached Properties Example 这个demo演示了为QML自定义类型添加信号的方法,这与Qt5官方demo解析集16--Chapter 2: Connecting to C++ Methods and Signals所介绍的差不多,鉴于例子的尺寸,可能那一篇要

Qt5官方demo解析集22——Extending QML - Object and List Property Types Example

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集21--Extending QML - Adding Types Example 在上一个例子中我们基于C++创建了一个自定义的QML类型,接下来,我们将该类作为另一个类的属性类型,定义了另一个birthdayparty类.这个例子与Qt5官方demo解析集19--Chapter 5: Using List Propert

Qt5官方demo解析集31——StocQt

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集30--Extending QML - Binding Example 最近在做QML制表,因此想找一些相关曲线绘制的demo看看,结果发现了这个例子,觉得挺不错,它相比于我们之前的Extend和Particle系列显得更大一些,涉及到的面也更广一些.因此想拿过来给大家分享~ 这个例子是基于QML的股票走势图绘制,数据来源