QT-------------自定义插件和库

以下是一个使用 Qt 实现图表交互操作的示例,涵盖了自定义图表视图类、不同类型的柱状图和饼图等内容。

实现思路

  1. 自定义图表视图类 :创建一个从 QChartView 派生的自定义类,用于处理图表的交互操作。
  2. 主窗口设计初始化 :在主窗口中使用 QVBoxLayoutQHBoxLayout 等布局管理器放置自定义图表视图类。
  3. 数据准备 :使用 QBarSetQBarSeries 准备柱状图的数据,使用 QPieSeries 准备饼图的数据。
  4. 交互操作功能的实现 :重写 mousePressEventmouseMoveEvent 等事件处理函数,在自定义的图表视图类中实现交互操作。

代码示例

cpp 复制代码
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QValueAxis>
#include <QtCharts/QPieSeries>
#include <QtCharts/QPieSlice>
#include <QtCharts/QAbstractBarSeries>
#include <QtCharts/QStackedBarSeries>
#include <QtCharts/QPercentBarSeries>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include <QtCore/QDebug>


QT_CHARTS_USE_NAMESPACE


// 自定义图表视图类
class TChartView : public QChartView {
public:
    TChartView(QChart *chart, QWidget *parent = nullptr) : QChartView(chart, parent) {
        setRenderHint(QPainter::Antialiasing);
    }

protected:
    void mousePressEvent(QMouseEvent *event) override {
        qDebug() << "Mouse pressed at: " << event->pos();
        QChartView::mousePressEvent(event);
    }

    void mouseMoveEvent(QMouseEvent *event) override {
        qDebug() << "Mouse moved to: " << event->pos();
        QChartView::mouseMoveEvent(event);
    }
};


int main(int argc, char *argv[]) {
    QApplication a(argc, argv);


    // 创建主窗口
    QMainWindow mainWindow;
    QWidget *centralWidget = new QWidget(&mainWindow);
    mainWindow.setCentralWidget(centralWidget);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);


    // 柱状图
    QBarSet *set0 = new QBarSet("Bar Set 1");
    *set0 << 1 << 2 << 3 << 4 << 5 << 6;
    QBarSet *set1 = new QBarSet("Bar Set 2");
    *set1 << 5 << 4 << 3 << 2 << 1 << 0;


    QBarSeries *barSeries = new QBarSeries();
    barSeries->append(set0);
    barSeries->append(set1);


    QChart *barChart = new QChart();
    barChart->addSeries(barSeries);
    barChart->setTitle("Bar Chart");


    QStringList categories;
    categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
    QBarCategoryAxis *axisX = new QBarCategoryAxis();
    axisX->append(categories);
    barChart->addAxis(axisX, Qt::AlignBottom);
    barSeries->attachAxis(axisX);


    QValueAxis *axisY = new QValueAxis();
    barChart->addAxis(axisY, Qt::AlignLeft);
    barSeries->attachAxis(axisY);


    TChartView *barChartView = new TChartView(barChart);
    layout->addWidget(barChartView);


    // 堆叠柱状图
    QStackedBarSeries *stackedBarSeries = new QStackedBarSeries();
    stackedBarSeries->append(set0);
    stackedBarSeries->append(set1);


    QChart *stackedBarChart = new QChart();
    stackedBarChart->addSeries(stackedBarSeries);
    stackedBarChart->setTitle("Stacked Bar Chart");


    QBarCategoryAxis *stackedAxisX = new QBarCategoryAxis();
    stackedAxisX->append(categories);
    stackedBarChart->addAxis(stackedAxisX, Qt::AlignBottom);
    stackedBarSeries->attachAxis(stackedAxisX);


    QValueAxis *stackedAxisY = new QValueAxis();
    stackedBarChart->addAxis(stackedAxisY, Qt::AlignLeft);
    stackedBarSeries->attachAxis(stackedAxisY);


    TChartView *stackedBarChartView = new TChartView(stackedBarChart);
    layout->addWidget(stackedBarChartView);


    // 百分比柱状图
    QPercentBarSeries *percentBarSeries = new QPercentBarSeries();
    percentBarSeries->append(set0);
    percentBarSeries->append(set1);


    QChart *percentBarChart = new QChart();
    percentBarChart->addSeries(percentBarSeries);
    percentBarChart->setTitle("Percent Bar Chart");


    QBarCategoryAxis *percentAxisX = new QBarCategoryAxis();
    percentAxisX->append(categories);
    percentBarChart->addAxis(percentAxisX, Qt::AlignBottom);
    percentBarSeries->attachAxis(percentAxisX);


    QValueAxis *percentAxisY = new QValueAxis();
    percentBarChart->addAxis(percentAxisY, Qt::AlignLeft);
    percentBarSeries->attachAxis(percentAxisY);


    TChartView *percentBarChartView = new TChartView(percentBarChart);
    layout->addWidget(percentBarChartView);


    // 饼图
    QPieSeries *pieSeries = new QPieSeries();
    pieSeries->append("Slice 1", 10);
    pieSeries->append("Slice 2", 20);
    pieSeries->append("Slice 3", 30);


    QChart *pieChart = new QChart();
    pieChart->addSeries(pieSeries);
    pieChart->setTitle("Pie Chart");


    TChartView *pieChartView = new TChartView(pieChart);
    layout->addWidget(pieChartView);


    mainWindow.show();


    return a.exec();
}

代码解释

  1. 自定义图表视图类 TChartView

    • 继承自 QChartView,在构造函数中设置抗锯齿渲染。
    • 重写 mousePressEventmouseMoveEvent 函数,用于输出鼠标按下和移动的位置信息,你可以根据需要扩展这些函数,实现更复杂的交互操作,如选择数据点、显示提示信息等。
  2. 主窗口设计初始化

    • 创建 QMainWindowQWidget 作为中央部件。
    • 使用 QVBoxLayout 布局管理器来管理多个图表视图。
  3. 柱状图

    • 创建 QBarSet 表示柱状图的数据集合。
    • 使用 QBarSeries 将多个 QBarSet 组合起来。
    • 使用 QBarCategoryAxis 作为 x 轴,QValueAxis 作为 y 轴。
    • 创建 QChart 并添加系列和坐标轴,然后使用 TChartView 显示图表。
  4. 堆叠柱状图和百分比柱状图

    • 与柱状图类似,但使用 QStackedBarSeriesQPercentBarSeries 代替 QBarSeries 以实现不同的显示效果。
  5. 饼图

    • 使用 QPieSeries 存储饼图的数据,每个 QPieSlice 代表一个扇区,设置扇区的名称和大小。

使用说明

  1. 复制上述代码到一个 .cpp 文件中,确保你已经正确配置了 Qt 开发环境,并且包含了必要的模块,如 QtWidgetsQtCharts

  2. .pro 文件中添加以下内容:

    QT += charts widgets
    CONFIG += c++11

  3. 编译并运行程序,你将看到一个包含柱状图、堆叠柱状图、百分比柱状图和饼图的窗口,并且可以在控制台中看到鼠标的交互信息。

相关推荐
无畏烧风1 小时前
[Qt] visual studio code 安装 Qt插件
qt
老纪的技术唠嗑局2 小时前
OceanBase PoC 经验总结(二)—— AP 业务
数据库
阿里云大数据AI技术3 小时前
OpenSearch 视频 RAG 实践
数据库·人工智能·llm
m0_623955665 小时前
Oracle使用SQL一次性向表中插入多行数据
数据库·sql·oracle
阿蒙Amon6 小时前
C#读写文件:多种方式详解
开发语言·数据库·c#
坏柠6 小时前
C++ Qt 基础教程:信号与槽机制详解及 QPushButton 实战
c++·qt
东窗西篱梦6 小时前
Redis集群部署指南:高可用与分布式实践
数据库·redis·分布式
就是有点傻7 小时前
C#如何实现中英文快速切换
数据库·c#
雨落倾城夏未凉7 小时前
4.信号与槽
后端·qt
1024小神7 小时前
hono框架绑定cloudflare的d1数据库操作步骤
数据库