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

相关推荐
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6751 小时前
数据库基础1
数据库
我爱松子鱼1 小时前
mysql之规则优化器RBO
数据库·mysql
cpp_learners1 小时前
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
qt·zlib·加密压缩·quazip
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白3 小时前
PostgreSQL:更新字段慢
数据库·postgresql