Qt例子学习笔记 - Examples/Qt-6.2.0/charts/areachart

//创建Area Charts
//要创建Area Charts,我们需要两个 QLineSeries 实例。
//他们将定义该区域的上下边界。

    QLineSeries *series0 = new QLineSeries();
    QLineSeries *series1 = new QLineSeries();

//我们将数据添加到两个系列并使用流运算符。

    *series0 << QPointF(1,5)<<QPointF(3,7)<<QPointF(7,5)<<QPointF(9,7)
    <<QPointF(12,6)<<QPointF(16,7)<<QPointF(18,5);

    *series1 << QPointF(1,3)<<QPointF(3,4)<<QPointF(7,3)<<QPointF(8,2)
    <<QPointF(16,4)<<QPointF(18,3);

//现在我们使用两个线系列对象创建一个 QAreaSeries 实例。
//我们设置自定义渐变填充和轮廓的宽度

    QAreaSeries *series = new QAreaseries(series0,series1);
    series->setName("Batman");
    QPen pen(0x059605);
    pen.setWidth(3);

    QLinearGradient gradient(QPointF(0,0),QPointF(0,1));
    gradient.setColorAt(0.0,0x3cc63c);
    gradient.setColorAt(1.0,0x26f626);
    gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
    series->setBrush(gradient);

//最后我们创建 QChartView 实例,设置标题,设置抗锯齿,并添加区域系列。
//我们还创建了默认轴并指定了它们的范围。

    QChart *chart = new QChart();
    chart->addSeries(series);
    chart->setTitle("Simple areachart example");
    chart->createDefaultAxes();
    chart->axes(Qt::Horixzontal).first()->setRange(0,20);
    chart->axes(Qt::Vertical).first()->setRange(0,10);

//图表已准备好显示。

    QCharView *chartView = new QCharView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

main.cpp

#include 
#include 
#include 
#include 
#include 

QT_USE_NAMESPACE

int main(int argc, char *argv[])
{
    //QApplication 专门为 QGuiApplication 提供了一些基于 QWidget 的应用程序所需的功能。
    //它处理特定于小部件的初始化、完成。
    //对于任何使用 Qt 的 GUI 应用程序,无论应用程序在任何给定时间是否有 0、1、2 或更多窗口,都恰好有一个 QApplication 对象。
    //对于非基于 QWidget 的 Qt 应用程序,请改用 QGuiApplication,因为它不依赖于 QtWidgets 库。
    //一些 GUI 应用程序提供了一种特殊的批处理模式,即。
    //提供命令行参数,无需人工干预即可执行任务。
    //在这种非 GUI 模式下,实例化一个普通的 QCoreApplication 通常就足够了
    //避免不必要地初始化图形用户界面所需的资源
    //以下示例显示了如何动态创建适当类型的应用程序实例:
    /*
        QCoreApplication* createApplication(int &argc,char *argv[])
        {
            for(int i = 1;i < argc;++i)
                if(!qstrcmp(argc[i],"-no-gui"))
                    return new QCoreApplication(argc,argv);
        }
        return new QApplication(argc,argv);
        
        int main(int argc,char *argv[])
        {
            QScopedPointer app(createApplication(argc,argv));

            if(qobject_cast(app.data()))
            {
                //start GUI version
            }
            else
            {
                //start non-GUI version
            }
            return app->exec();
        }
    */
    //QApplication 对象可通过 instance() 函数访问,该函数返回等效于全局 qApp 指针的指针。
    //QApplication 的主要职责范围是:
    //它使用用户的桌面设置初始化应用程序,
    //例如palette()、font() 和doubleClickInterval()。
    //它会跟踪这些属性,以防用户全局更改桌面,例如通过某种控制面板。

    //它执行事件处理,这意味着它从底层窗口系统接收事件并将它们分派给相关的小部件。
    //通过使用 sendEvent() 和 postEvent(),您可以将自己的事件发送到小部件。

    //它解析常见的命令行参数并相应地设置其内部状态。
    //有关更多详细信息,请参阅下面的构造函数文档。

    //它定义了应用程序的外观和感觉,它被封装在一个 QStyle 对象中。
    //这可以在运行时使用 setStyle() 进行更改。

    //它通过 translate() 提供对用户可见的字符串的本地化。
    //它提供了一些神奇的对象,比如 clipboard()。

    //它知道应用程序的窗口。 您可以使用 widgetAt() 询问哪个小部件位于某个位置,获取 topLevelWidgets() 和 closeAllWindows() 等列表。

    //它管理应用程序的鼠标光标处理,参见 setOverrideCursor()

    //由于 QApplication 对象进行了如此多的初始化,因此必须在创建与用户界面相关的任何其他对象之前创建它
    //QApplication 还处理常见的命令行参数。
    //因此,在应用程序本身对 argv 进行任何解释或修改之前创建它通常是一个好主意。



    QApplication a(argc, argv);

    //QLineSeries折线图用于将信息显示为由直线连接的一系列数据点。
    //创建基本折线图很简单:
    /*
        QLineSeries* series = new QLineSeries();
        series->append(0,6);
        series->append(2,4);
        ...
        chart->addSeries(series);
    */
    //QAbstractSeries
    //通常,使用特定于系列类型的继承类而不是基类。
    //useOpenGL : bool
    //指定是否使用 OpenGL 加速绘制系列。
    //仅 QLineSeries 和 QScatterSeries 支持使用 OpenGL 进行加速。
    //用作 QAreaSeries 边缘系列的线系列不能使用 OpenGL 加速。
    //当图表包含任何使用 OpenGL 绘制的系列时,
    //会在图表绘图区域的顶部创建一个透明的 QOpenGLWidget。
    //加速系列不是绘制在底层的 QGraphicsView 上,
    //而是绘制在创建的 QOpenGLWidget 上。

    //使用 OpenGL 加速系列绘图所获得的性能取决于底层硬件
    //但在大多数情况下,它很重要。
    //例如,在标准台式计算机上,为系列启用 OpenGL 加速通常允许渲染至少一百倍的点而不会降低帧速率。
    //图表大小对帧速率的影响也较小。

    //系列绘图的 OpenGL 加速适用于需要快速绘制大量点的用例。
    //它针对效率进行了优化,因此使用它的系列缺乏对非加速系列可用的许多功能的支持:
    //加速系列不支持系列动画。
    //加速系列不支持点标签。

    //加速系列将忽略钢笔样式、标记形状和光标记。
    //仅支持实线和普通散点。
    //散点可以是圆形或矩形,具体取决于底层图形硬件和驱动程序。

    //极坐标图不支持加速系列。
    //使用加速系列时,不建议启用图表投影或使用透明图表背景颜色,因为这会显着降低帧速率。

    //这些额外的限制源于这样一个事实,即加速系列是在图表顶部的单独小部件上绘制的:

    //如果在包含加速系列的图表顶部绘制任何图形项目,则加速系列将绘制在这些项目上。
    //对于图形场景附加了多个图形视图的用例,不支持加速系列。

    //对于图表具有非默认几何形状的用例,不支持加速系列。
    //例如,向图形视图添加变换会导致在与图表相关的错误位置绘制加速系列。

    //默认值为false
    //QXYSeries 支持在图表上显示最佳拟合线。 最佳拟合线是穿过图表的一条线,表示点之间的关系。

    //在条形图中,条形被定义为包含每个类别一个数据值的条形集。
    //条形的位置由类别指定,其高度由数据值指定。
    //包含多个条形集的条形系列将属于同一类别的条形组合在一起。
    //条形图的显示方式由选择用于创建条形图的此类的子类决定。
    //如果使用 QValueAxis 而不是 QBarCategoryAxis 作为主条形轴,
    //条形将围绕类别的索引值分组。
    //请参阅条形图示例以了解如何使用 QBarSeries 类创建简单的条形图。

    //QBarSeries
    //此类将数据绘制为一系列按类别分组的垂直条形,
    //个条形集中的每个类别一个条形添加到该系列中。
    //请参阅条形图示例以了解如何创建分组条形图。

    //QHorizontalBarSeries
    //此类将数据绘制为一系列按类别分组的水平条
    //每个条集中的每个类别一个条添加到该系列中。

    //QHorizontalPercentBarSeries
    //此类将数据绘制为一系列大小均匀的水平堆叠条,每个类别一个条。
    //添加到系列中的每个条形集为每个堆叠的条形贡献一个单独的段。
    //段大小对应于段值与堆栈中所有段的总值的百分比。
    //不绘制具有零值的条。

    //QHorizontalStackedBarSeries
    //添加到系列中的每个条形集为每个堆叠的条形贡献一个单独的段。

    //QAreaSeries
    //面积序列用于显示定量数据。
    //它基于线系列,以颜色强调边界线之间的区域。
    //由于面积系列是基于线系列的
    //所以QAreaSeries 构造函数需要一个QLineSeries 实例,它定义了面积的上边界。
    //面积图默认以绘图区域的底部为下边界绘制。
    //可以用另一条线指定下边界,而不是绘图区域的底部。
    //这种情况下,应该使用两个 QLineSeries 实例初始化 QAreaSeries。

    //注意:在下边界值大于上边界值的情况下,
    //术语上边界和下边界可能会产生误导。
    //重点是这两条边界线之间的区域将被填充。

    //QBoxPlotSeries
    //箱线图系列充当箱须项的容器。
    //来自多个系列的项目根据其索引值分组到类别中。

    //QBarCategoryAxis 类用于将类别添加到图表的轴。
    //类别标签必须是唯一的。
    //如果为多个盒须项目定义了相同的类别标签,则仅绘制第一个。

    //QCandlestickSeries
    //此类充当单个烛台项目的容器。
    //使用 QBarCategoryAxis 时,每个项目都被绘制到自己的类别中。
    //QDateTimeAxis 和 QValueAxis 可以用作 QBarCategoryAxis 的替代品
    //在这种情况下,每个烛台项目是根据其时间戳值绘制的。

    //注意:时间戳在 QCandlestickSeries 中必须是唯一的。
    //使用 QBarCategoryAxis 时,仅绘制第一个共享时间戳的烛台项目。
    //如果图表包含 QCandlestickSeries 的多个实例,
    //则来自共享时间戳的不同系列的项目将被绘制到同一类别。
    //使用 QValueAxis 或 QDateTimeAxis 时
    //共享时间戳的烛台项目将相互重叠。

    // QPieSlice
    //饼图系列由定义为 QPieSlice 对象的切片组成。
    //切片可以有任何值
    //因为 QPieSeries 对象计算切片与系列中所有切片总和的百分比,
    //以确定图表中切片的实际大小。

    //图表上的饼图大小和位置通过使用范围从 0.0 到 1.0 的相对值进行控制。
    //这些与实际的图表矩形有关。

    //默认情况下,饼图定义为完整饼图。
    //可以通过设置系列的起始角度和角度跨度来创建部分饼图。
    //个完整的馅饼是 360 度,其中 0 是 12 点钟。


    QLineSeries *series0 = new QLineSeries();
    QLineSeries *series1 = new QLineSeries();


    *series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6)
             << QPointF(16, 7) << QPointF(18, 5);
    *series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3)
             << QPointF(16, 4) << QPointF(18, 3);

    //QAreaSeries
    //面积序列用于显示定量数据。
    //它基于线系列,以颜色强调边界线之间的区域。
    //由于面积系列是基于线系列的
    //所以QAreaSeries 构造函数需要一个QLineSeries 实例,它定义了面积的上边界。
    //面积图默认以绘图区域的底部为下边界绘制。
    //可以用另一条线指定下边界,而不是绘图区域的底部。
    //这种情况下,应该使用两个 QLineSeries 实例初始化 QAreaSeries。

    //注意:在下边界值大于上边界值的情况下,
    //术语上边界和下边界可能会产生误导。
    //重点是这两条边界线之间的区域将被填充。

    QAreaSeries *series = new QAreaSeries(series0, series1);
    series->setName("Batman");
    QPen pen(0x059605);
    pen.setWidth(3);
    //设置用于绘制区域轮廓的笔。
    series->setPen(pen);

    //线性渐变在起点和终点之间插入颜色。
    //在这些点之外,根据当前设置的传播方法,渐变被填充、反射或重复:
    //渐变中的颜色是使用 QGradientStop 类型的停止点定义的,即位置和颜色。
    //使用 QGradient::setColorAt() 或 QGradient::setStops() 函数来定义停止点。
    //渐变的完整停止点集描述了应如何填充渐变区域。
    //如果未指定停止点,则使用 0 处的黑色到 1 处的白色渐变。

    //除了继承自 QGradient 的函数外
    //QLinearGradient 类还提供了返回渐变终点的 finalStop() 
    //函数和返回渐变起点的 start() 函数。
    
    //QLinearGradient::QLinearGradient(const QPointF &start, const QPointF &finalStop)
    //在给定的起始点和 finalStop 之间构造一个带有插值区域的线性渐变。

    //QPointF
    //一个点由 x 坐标和 y 坐标指定,
    //可以使用 x() 和 y() 函数访问它们。
    //为了精确起见,使用有限浮点数指定点的坐标
    //如果 x 和 y 都设置为 0.0,则 isNull() 函数返回 true。
    //可以使用 setX() 和 setY() 函数设置(或更改)坐标
    //或者使用返回坐标引用的 rx() 和 ry() 函数(允许直接操作)。
    //给定一个点 p,以下语句都是等价的:
    /*
        QPointF p;
        p.setX(p.x() + 1.0);
        p += QPointF(1.0,0.0);
        p.rx()++;
    */
    //QPointF 对象也可以用作向量:
    //加法和减法的定义与向量相同(每个分量单独相加)。
    //QPointF 对象也可以除以或乘以 int 或 qreal。
    //此外,QPointF 类提供了一个将 QPoint 对象转换为 QPointF 对象的构造函数,
    //以及相应的 toPoint() 函数,该函数返回该点的 QPoint 副本。
    //最后,QPointF 对象可以进行流式传输和比较。

    QLinearGradient gradient(QPointF(0, 0), QPointF(0, 1));
    //void QGradient::setColorAt(qreal position, const QColor &color)
    //在给定的位置用给定的颜色创建一个停止点。
    //给定的位置必须在 0 到 1 的范围内。
    gradient.setColorAt(0.0, 0x3cc63c);
    gradient.setColorAt(1.0, 0x26f626);
    //void QGradient::setCoordinateMode(QGradient::CoordinateMode mode)
    //将此渐变的坐标模式设置为模式。
    //默认模式是逻辑模式。
    //enum QGradient::CoordinateMode
    //此枚举指定渐变坐标如何映射到使用渐变的绘制设备。
    //QGradient::LogicalMode
    //这是默认模式。 渐变坐标是指定的逻辑空间,就像对象坐标一样。

    //QGradient::ObjectMode
    //在这种模式下,梯度坐标是相对于绘制对象的边界矩形而言的
    //(0,0) 位于左上角,(1,1) 位于对象边界矩形的右下角。 这个值是在 Qt 5.12 中添加的。
    
    //QGradient::StretchToDeviceMode
    //在这种模式下,渐变坐标相对于绘制设备的边界矩形
    //(0,0) 位于绘制设备的左上角,(1,1) 位于绘制设备的右下角。

    //QGradient::ObjectBoundingMode
    //此模式与 ObjectMode 相同,除了 {QBrush::transform()} {brush transform}
    //(如果有)是相对于逻辑空间而不是对象空间应用的。
    //此枚举值已弃用,不应在新代码中使用。

    gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
    series->setBrush(gradient);
    //QChart 是一个 QGraphicsWidget,
    //您可以在 QGraphicsScene 中显示它。
    //它管理不同类型系列和其他图表相关对象(如图例和轴)的图形表示。
    //为了简单地在布局中显示图表
    //可以使用便利类 QChartView 代替 QChart。
    //此外,可以使用 QPolarChart 类将折线、样条曲线、面积和散点序列显示为极坐标图。
    
    //QGraphicsWidget 是一个扩展的基础项,
    //它在 QGraphicsItem 之上提供额外的功能
    //它在很多方面与 QWidget 相似:
    //提供调色板、字体和样式()。
    //有一个定义的几何()。
    //使用 setLayout() 和 layout() 支持布局。
    //支持使用grabShortcut() 和insertAction() 的快捷方式和动作

    //与 QGraphicsItem 不同,
    //QGraphicsWidget 不是抽象类;
    //您可以创建 QGraphicsWidget 的实例而无需对其进行子类化。
    //这种方法对于仅用于将子小部件组织到布局中的小部件很有用。

    //如果您需要高级输入焦点处理(例如选项卡焦点和激活或布局)
    //QGraphicsWidget 可以用作您自己的自定义项的基础项。
    //由于 QGraphicsWidget 类似于 QWidget 并且具有相似的 API
    //因此将小部件从 QWidget 移植到 QGraphicsWidget 会更容易,
    //而不是 QGraphicsItem。

    //QGraphicsWidget 和 QWidget 之间的显着区别是:
    //QGraphicsWidget 坐标和几何用 qreals 定义(双精度或浮点数,取决于平台)
    //QWidget  QWidget 使用整数几何(QPoint、QRect)。
    //QGraphicsWidget 默认情况下,小部件已经可见; 您不必调用 show() 来显示小部件。
    //QWidget 默认情况下,QWidget 是隐藏的,直到您调用 show()。
    //QGraphicsWidget 支持小部件属性的子集。
    //QWidget 支持所有小部件属性。
    //QGraphicsWidget 顶级项目的样式默认为 QGraphicsScene::style
    //QWidget 顶级小部件的样式默认为 QApplication::style
    //QGraphicsWidget Graphics View 提供了自定义的拖放框架,不同于 QWidget。
    //QWidget 标准拖放框架。
    //QGraphicsWidget 小部件项目不支持模式。
    //QWidget 全模态支持。
    //QGraphicsWidget 支持 Qt 的小部件属性的子集,
    //(Qt::WidgetAttribute),如下表所示。
    //此表中未列出的任何属性均不受支持或未使用。
    //Qt::WA_SetLayoutDirection
    //由 setLayoutDirection() 设置,由 unsetLayoutDirection() 清除。
    //您可以测试此属性以检查小部件是否已显式分配了 layoutDirection。
    //如果未设置该属性,则继承 layoutDirection()。

    //Qt::WA_RightToLeft
    //由 setLayoutDirection() 切换。 从父/场景继承。 
    //如果设置,小部件的布局将从右到左对水平排列的小部件进行排序。

    //Qt::WA_SetStyle
    //由 setStyle() 设置和清除。如果设置了此属性,则小部件已明确分配了样式。
    //如果未设置,小部件将使用场景或应用程序的样式。

    //Qt::WA_Resized 由 setGeometry() 和 resize() 设置。

    //Qt::WA_SetPalette
    //由 setPalette() 设置。

    //Qt::WA_SetFont
    //由 setFont() 设置。

    //Qt::WA_WindowPropagation 启用到窗口小部件的传播。

    //虽然 QGraphicsWidget 继承自 QObject 和 QGraphicsItem
    //但您应该使用 QGraphicsItem 提供的功能
    //而不是 QObject
    //来管理父项和子项之间的关系。
    //这些函数控制项目的堆叠顺序及其所有权。


    QChart *chart = new QChart();
    //将系列系列添加到图表并取得它的所有权。
    //void QChart::addSeries(QAbstractSeries *series)
    //注意:默认情况下,新添加的系列不附加到任何轴
    //即使是在将系列添加到图表之前使用 createDefaultAxes() 为图表创建的系列也不例外。
    //如果在显示图表之前没有轴附加到新添加的系列,
    //则该系列将被绘制,就好像它的轴的范围完全适合该系列到图表的绘图区域。
    //如果同一图表还显示具有正确附加轴的其他系列,
    //这可能会令人困惑,因此请始终确保在添加系列后调用 createDefaultAxes() 或为系列显式附加轴。

    chart->addSeries(series);
    

    chart->setTitle("Simple areachart example");
    //void QChart::createDefaultAxes()
    //根据已添加到图表的系列为图表创建轴
    //之前添加到图表中的任何轴都将被删除。
    //注意:必须在所有系列都添加到图表后调用此函数。
    //调用此函数后,此函数创建的轴不会自动附加到添加到图表中的任何系列。
    //默认情况下,没有附加轴的系列将缩放以利用图表的整个绘图区域
    //如果还存在其他具有正确附加轴的系列,则可能会造成混淆。
    //Series type   Horizontal axis (X) Vertical axis (Y)
    //QXYSeries QValueAxis  QValueAxis
    //QBarSeries QBarCategoryAxis QValueAxis
    //QPieSeries  None None
    //如果在图表中添加了多个 QXYSeries 派生系列
    chart->createDefaultAxes();
    //QList QChart::axes(Qt::Orientations orientation = Qt::Horizontal|Qt::Vertical, QAbstractSeries *series = nullptr) const
    //返回附加到具有由orientation 指定的方向的系列系列的轴
    //如果未指定系列,则返回添加到具有指定方向的图表的所有轴。    
    //T &QList::first()
    //返回对列表中第一项的引用。 此函数假定列表不为空。
    chart->axes(Qt::Horizontal).first()->setRange(0, 20);
    chart->axes(Qt::Vertical).first()->setRange(0, 10);

    //图表视图不需要 QGraphicsScene 对象即可工作
    //要在现有 QGraphicsScene 中显示图表
    //应改用 QChart 或 QPolarChart 类。
    QChartView *chartView = new QChartView(chart);

    chartView->setRenderHint(QPainter::Antialiasing);

    QMainWindow window;
    window.setCentralWidget(chartView);
    window.resize(400, 300);
    window.show();

    return a.exec();
}

Qt例子学习笔记 - Examples/Qt-6.2.0/charts/areachart_第1张图片

你可能感兴趣的:(Qt,学习,Qt,qt,开发语言)