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

相关推荐
小龙在山东3 小时前
memcached的基本使用
数据库·缓存·memcached
亦世凡华、4 小时前
MySQL--》快速提高查询效率:SQL语句优化技巧与实践
数据库·经验分享·sql·mysql·sql优化
不是二师兄的八戒4 小时前
深入 Redis:高级特性与最佳实践
数据库·redis·缓存
Libby博仙5 小时前
创建.net core 8.0项目时,有个启用原生AOT发布是什么意思
microsoft·asp.net·.netcore
drebander6 小时前
SQL 分析函数与聚合函数的组合应用
大数据·数据库·sql
LLLuckyGirl~6 小时前
node.js之---集群(Cluster)模块
数据库
ccmjga6 小时前
Spring Boot 3 配置大全系列 —— 如何配置用户的登录与认证?
java·数据库·spring boot·后端·spring·单元测试·gradle
Dann Hiroaki6 小时前
文献分享:跨模态的最邻近查询RoarGraph
数据库·图搜索
泰山小张只吃荷园6 小时前
软件体系结构、设计模式、课程期末复习知识点全总结-SCAU
网络·数据库·sql·计算机网络·设计模式·sqlserver
JM_life7 小时前
Python入门系列之九-数据分析与可视化
数据库·python·数据分析