精华内容
下载资源
问答
  • qt数据可视化,大屏幕,科幻效果 大数据可视化-科幻效果-图片素材(psd文件 3.6G)见https://download.csdn.net/download/zp349295931/12562144
  • QT可视化大屏看板,已经编译成功,可以直接运行
  • Qt高级——Qt数据可视化性能优化

    千次阅读 2019-05-25 15:32:39
    Qt高级——Qt数据可视化性能优化 一、数据可视化简介 1、数据可视化简介 数据可视化即采用图形图表等对采集的数据进行展示,可以非常直观的查看传感器采集到的数据。本文将使用Qt的标准组件QTableWidget、标准模型、...

    Qt高级——Qt数据可视化性能优化

    一、数据可视化简介

    1、数据可视化简介

    数据可视化即采用图形图表等对采集的数据进行展示,可以非常直观的查看传感器采集到的数据。本文将使用Qt的标准组件QTableWidget、标准模型、自定义模型分别实现对数据的表格展示。

    2、系统环境

    个人PC:ThinkPad T450
    操作系统:RHEL7.3 WorkStation
    内存容量:8G
    磁盘容量:SSD 100G
    CPU:Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz

    二、标准界面组件实现

    1、代码实现

    MainWindow.h文件:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QWidget>
    #include <QTableWidget>
    #include <QVBoxLayout>
    #include <QTableWidgetItem>
    #include <QList>
    #include <QString>
    
    struct Student
    {
        char name[16];
        char id[24];
        char sex[8];
        int age;
        char phone[16];
        char hobby[24];
        char company[16];
    };
    
    class MainWindow : public QWidget
    {
        Q_OBJECT
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
        /**
         * @brief 生成数据
         * @param size,生成数据的规模
         */
        void generateData(int size);
    private:
        /**
         * @brief 生成一行数据
         * @param item,数据项
         * @return 返回数据项链表
         */
        QList<QTableWidgetItem*> generateRow(const Student& item);
    private:
        QTableWidget* m_table;
    };
    
    #endif // MAINWINDOW_H

    MainWindow.cpp文件:

    #include "MainWindow.h"
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent) : QWidget(parent)
    {
        m_table = new QTableWidget(this);
        QVBoxLayout* layout = new QVBoxLayout;
        layout->addWidget(m_table);
        setLayout(layout);
        QStringList header;
        header << "Name" << "ID" << "Sex" << "Age" << "Phone" << "Hobby" << "Company";
        m_table->setHorizontalHeaderLabels(header);
        m_table->setColumnCount(7);
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    // 头部插入实现
    void MainWindow::generateData(int size)
    {
        Student* zhangsan = (Student*)malloc(sizeof(Student));
        memset(zhangsan, 0, sizeof(Student));
        strncpy(zhangsan->name, "zhangsan", strlen("zhangsan"));
        strncpy(zhangsan->id, "53302219861001xxxx", strlen("53302219861001xxxx"));
        strncpy(zhangsan->sex, "M", strlen("M"));
        zhangsan->age = 33;
        strncpy(zhangsan->phone, "18910108888", strlen("18910108888"));
        strncpy(zhangsan->hobby, "BasketBall, Play", strlen("BasketBall, Play"));
        strncpy(zhangsan->company, "Alibaba", strlen("Alibaba"));
    
        for(int i = 0; i < size; i++)
        {
            m_table->insertRow(0);
            QList<QTableWidgetItem*> items1 = generateRow(*zhangsan);
            for(int k = 0; k < items1.size(); k++)
            {
                m_table->setItem(0, k, items1.at(k));
            }
        }
        delete zhangsan;
        qDebug() << sizeof(Student);
    
    }
    // 尾部插入实现
    void MainWindow::generateData(int size)
    {
        Student* zhangsan = (Student*)malloc(sizeof(Student));
        memset(zhangsan, 0, sizeof(Student));
        strncpy(zhangsan->name, "zhangsan", strlen("zhangsan"));
        strncpy(zhangsan->id, "53302219861001xxxx", strlen("53302219861001xxxx"));
        strncpy(zhangsan->sex, "M", strlen("M"));
        zhangsan->age = 33;
        strncpy(zhangsan->phone, "18910108888", strlen("18910108888"));
        strncpy(zhangsan->hobby, "BasketBall, Play", strlen("BasketBall, Play"));
        strncpy(zhangsan->company, "Alibaba", strlen("Alibaba"));
    
        for(int i = 0; i < size; i++)
        {
            m_table->insertRow(i);
            QList<QTableWidgetItem*> items1 = generateRow(*zhangsan);
            for(int k = 0; k < items1.size(); k++)
            {
                m_table->setItem(i, k, items1.at(k));
            }
        }
        delete zhangsan;
        qDebug() << sizeof(Student);
    
    }
    
    QList<QTableWidgetItem*> MainWindow::generateRow(const Student &item)
    {
        QList<QTableWidgetItem*> ret;
        QTableWidgetItem* name = new QTableWidgetItem();
        name->setData(Qt::DisplayRole, QString("%1").arg(item.name));
        ret.append(name);
        QTableWidgetItem* id = new QTableWidgetItem();
        id->setData(Qt::DisplayRole, QString("%1").arg(item.id));
        ret.append(id);
        QTableWidgetItem* sex = new QTableWidgetItem();
        sex->setData(Qt::DisplayRole, QString("%1").arg(item.sex));
        ret.append(sex);
        QTableWidgetItem* age = new QTableWidgetItem();
        age->setData(Qt::DisplayRole, QString("%1").arg(item.age));
        ret.append(age);
        QTableWidgetItem* phone = new QTableWidgetItem();
        phone->setData(Qt::DisplayRole, QString("%1").arg(item.phone));
        ret.append(phone);
        QTableWidgetItem* hobby = new QTableWidgetItem();
        hobby->setData(Qt::DisplayRole, QString("%1").arg(item.hobby));
        ret.append(hobby);
        QTableWidgetItem* company = new QTableWidgetItem();
        company->setData(Qt::DisplayRole, QString("%1").arg(item.company));
        ret.append(company);
        return ret;
    }

    main.cpp文件:

    #include "MainWindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.generateData(500000);
        w.show();
    
        return a.exec();
    }

    2、性能分析
    Student结构体如下:

    struct Student
    {
        char name[16];
        char id[24];
        char sex[8];
        int age;
        char phone[16];
        char hobby[24];
        char company[16];
    };

    Student结构体大小为108字节,根据生成的不同数量规模的数据,其程序占用的内存如下:
    Qt高级——Qt数据可视化性能优化
    根据上述数据,在大规模数据量下,使用QTableWidget展示数据时,每条数据实际占用的内存是数据本身大小的15倍,数据量越大插入越耗时,头部插入耗时远远大于尾部追加插入。

    三、标准模型实现

    1、代码实现

    StudentTableModel.h文件:

    #ifndef STUDENTTABLEMODEL_H
    #define STUDENTTABLEMODEL_H
    
    #include <QStandardItemModel>
    #include <QStandardItem>
    
    struct Student
    {
        char name[16];
        char id[24];
        char sex[8];
        int age;
        char phone[16];
        char hobby[24];
        char company[16];
    };
    
    class StudentTableModel : public QStandardItemModel
    {
        Q_OBJECT
    public:
        StudentTableModel();
        /**
         * @brief 生成数据
         * @param size,数据规模
         */
        void generateData(int size);
        /**
         * @brief 生成一行数据
         * @param item,数据对象
         * @return 返回数据项链表
         */
        QList<QStandardItem*> generateRow(const Student& item);
        /**
         * @brief 追加一行
         * @param item,数据对象
         */
        void appendRow(const Student& item);
    
    private:
        QStandardItem* m_root;//模型虚拟根节点
    };
    
    #endif // STUDENTTABLEMODEL_H

    StudentTableModel.cpp文件:

    #include "StudentTableModel.h"
    
    StudentTableModel::StudentTableModel()
    {
        m_root = invisibleRootItem();
    }
    
    void StudentTableModel::generateData(int size)
    {
        Student* zhangsan = (Student*)malloc(sizeof(Student));
        memset(zhangsan, 0, sizeof(Student));
        strncpy(zhangsan->name, "zhangsan", strlen("zhangsan"));
        strncpy(zhangsan->id, "53302219861001xxxx", strlen("53302219861001xxxx"));
        strncpy(zhangsan->sex, "M", strlen("M"));
        zhangsan->age = 33;
        strncpy(zhangsan->phone, "18910108888", strlen("18910108888"));
        strncpy(zhangsan->hobby, "BasketBall, Play", strlen("BasketBall, Play"));
        strncpy(zhangsan->company, "Alibaba", strlen("Alibaba"));
    
        for(int i = 0; i < size; i++)
        {
            QList<QStandardItem*> items1 = generateRow(*zhangsan);
            // 尾部追加
            m_root->appendRow(items1);
            // 头部插入
            m_root->insertRow(0, items1);
        }
        delete zhangsan;
    }
    
    QList<QStandardItem*> StudentTableModel::generateRow(const Student &item)
    {
        QList<QStandardItem*> ret;
        QStandardItem* name = new QStandardItem();
        name->setData(QString("%1").arg(item.name), Qt::DisplayRole);
        ret.append(name);
        QStandardItem* id = new QStandardItem();
        id->setData(QString("%1").arg(item.id), Qt::DisplayRole);
        ret.append(id);
        QStandardItem* sex = new QStandardItem();
        sex->setData(QString("%1").arg(item.sex), Qt::DisplayRole);
        ret.append(sex);
        QStandardItem* age = new QStandardItem();
        age->setData(QString("%1").arg(item.age), Qt::DisplayRole);
        ret.append(age);
        QStandardItem* phone = new QStandardItem();
        phone->setData(QString("%1").arg(item.phone), Qt::DisplayRole);
        ret.append(phone);
        QStandardItem* hobby = new QStandardItem();
        hobby->setData(QString("%1").arg(item.hobby), Qt::DisplayRole);
        ret.append(hobby);
        QStandardItem* company = new QStandardItem();
        company->setData(QString("%1").arg(item.company), Qt::DisplayRole);
        ret.append(company);
        return ret;
    }

    MainWindow.h文件:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QWidget>
    #include <QTableView>
    #include <QVBoxLayout>
    #include <QHeaderView>
    #include "StudentTableModel.h"
    
    class MainWindow : public QWidget
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
        void generateData(int size);
    private:
        QTableView* m_tableView;
        StudentTableModel* m_model;
    };
    
    #endif // MAINWINDOW_H

    MainWindow.cpp文件:

    #include "MainWindow.h"
    
    MainWindow::MainWindow(QWidget *parent): QWidget(parent)
    {
        m_tableView = new QTableView(this);
        QVBoxLayout* layout = new QVBoxLayout;
        layout->addWidget(m_tableView);
        setLayout(layout);
        m_model = new StudentTableModel();
        m_tableView->setModel(m_model);
        QStringList header;
        header << "Name" << "ID" << "Sex" << "Age" << "Phone" << "Hobby" << "Company";
        m_model->setHorizontalHeaderLabels(header);
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    void MainWindow::generateData(int size)
    {
        m_model->generateData(size);
    }

    main.cpp文件:

    #include "MainWindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        w.generateData(500000);
    
        return a.exec();
    }

    2、性能分析

    根据生成的不同数量规模的数据,其程序占用的内存如下:
    Qt高级——Qt数据可视化性能优化
    使用QStandardItemModel与QTableView展示数据,每条数据实际占用内存的大小是数据本身大小的15倍,数据量越大插入越耗时,头部插入耗时远远大于尾部追加插入,其性能表现与QTableWidget相当。

    四、自定义模型实现

    1、代码实现

    StudentTableModel.h文件:

    #ifndef STUDENTTABLEMODEL_H
    #define STUDENTTABLEMODEL_H
    
    #include <QAbstractTableModel>
    #include <QList>
    #include <QStringList>
    #include <QString>
    #include <QVariant>
    
    struct Student
    {
        char name[16];
        char id[24];
        char sex[8];
        int age;
        char phone[16];
        char hobby[24];
        char company[16];
    };
    
    class StudentTableModel : public QAbstractTableModel
    {
        Q_OBJECT
    public:
        StudentTableModel(QObject* parent = NULL);
        virtual int rowCount(const QModelIndex &parent) const;
        virtual int columnCount(const QModelIndex &parent) const;
        virtual QVariant data(const QModelIndex &index, int role) const;
        virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
        virtual Qt::ItemFlags flags(const QModelIndex &index) const;
        virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
        virtual bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex());
        virtual bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());
        void appendRow(const Student& item);
        void setHorizontalHeaderLabels(const QStringList& header);
    private:
        QStringList m_headers;
        QList<Student*> m_itemList;
    };
    
    #endif // STUDENTTABLEMODEL_H

    StudentTableModel.cpp文件:

    #include "StudentTableModel.h"
    
    StudentTableModel::StudentTableModel(QObject *parent): QAbstractTableModel(parent)
    {
    }
    
    int StudentTableModel::rowCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent);
        return m_itemList.size();
    }
    
    int StudentTableModel::columnCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent);
        return m_headers.size();
    }
    
    QVariant StudentTableModel::data(const QModelIndex &index, int role) const
    {
        if (!index.isValid())
            return QVariant();
    
        if (index.row() >= m_itemList.size() || index.row() < 0)
            return QVariant();
    
        if (role == Qt::DisplayRole)
        {
            int row = index.row();
            Student* data = m_itemList.at(row);
            int column = index.column();
            switch(column)
            {
            case 0:
                return QString("%1").arg(data->name);
            case 1:
                return QString("%1").arg(data->id);
            case 2:
                return QString("%1").arg(data->sex);
            case 3:
                return data->age;
            case 4:
                return QString("%1").arg(data->phone);
            case 5:
                return QString("%1").arg(data->hobby);
            case 6:
                return QString("%1").arg(data->company);
            }
        }
        return QVariant();
    }
    
    QVariant StudentTableModel::headerData(int section, Qt::Orientation orientation, int role) const
    {
        if (role != Qt::DisplayRole)
            return QVariant();
    
        if (orientation == Qt::Horizontal)
        {
            return m_headers.at(section);
        }
        return QVariant();
    }
    
    bool StudentTableModel::insertRows(int position, int rows, const QModelIndex &index)
    {
        Q_UNUSED(index);
        beginInsertRows(QModelIndex(), position, position + rows - 1);
    
        for (int row = 0; row < rows; ++row)
        {
    //        m_itemList.insert(position, );
        }
    
        endInsertRows();
        return true;
    }
    
    bool StudentTableModel::removeRows(int position, int rows, const QModelIndex &index)
    {
        Q_UNUSED(index);
        beginRemoveRows(QModelIndex(), position, position + rows - 1);
    
        for (int row = 0; row < rows; ++row)
            m_itemList.removeAt(position);
    
        endRemoveRows();
        return true;
    }
    
    void StudentTableModel::appendRow(const Student &item)
    {
        Student* data = (Student*)malloc(sizeof(Student));
        memset(data, 0, sizeof(Student));
        strncpy(data->name, item.name, strlen(item.name));
        strncpy(data->id, item.id, strlen(item.id));
        strncpy(data->sex, item.sex, strlen(item.sex));
        data->age = item.age;
        strncpy(data->phone, item.phone, strlen(item.phone));
        strncpy(data->hobby, item.hobby, strlen(item.hobby));
        strncpy(data->company, item.company, strlen(item.company));
        int row = m_itemList.size();
        insertRows(0, 1);
        m_itemList.append(data);
    //    m_itemList.insert(0, data);
    }
    
    void StudentTableModel::setHorizontalHeaderLabels(const QStringList &header)
    {
        m_headers = header;
    }
    
    bool StudentTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        if (index.isValid() && role == Qt::EditRole)
        {
            int row = index.row();
            // mpdify data
    
            emit(dataChanged(index, index));
            return true;
        }
        return false;
    }
    
    Qt::ItemFlags StudentTableModel::flags(const QModelIndex &index) const
    {
        if (!index.isValid())
            return Qt::ItemIsEnabled;
        return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
    }

    MainWindow.h文件:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QWidget>
    #include <QTableView>
    #include <QVBoxLayout>
    #include "StudentTableModel.h"
    
    class MainWindow : public QWidget
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        void generateData(int size);
    private:
        StudentTableModel* m_model;
        QTableView* m_tableView;
    };
    
    #endif // MAINWINDOW_H

    MainWindow.cpp文件:

    #include "MainWindow.h"
    
    MainWindow::MainWindow(QWidget *parent): QWidget(parent)
    {
        m_tableView = new QTableView(this);
        m_model = new StudentTableModel();
        QVBoxLayout* layout = new QVBoxLayout;
        layout->addWidget(m_tableView);
        setLayout(layout);
    
        QStringList header;
        header << "Name" << "ID" << "Sex" << "Age" << "Phone" << "Hobby" << "Company";
        m_model->setHorizontalHeaderLabels(header);
        m_tableView->setUpdatesEnabled(true);
        m_tableView->setModel(m_model);
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
    void MainWindow::generateData(int size)
    {
        Student* zhangsan = (Student*)malloc(sizeof(Student));
        memset(zhangsan, 0, sizeof(Student));
        strncpy(zhangsan->name, "zhangsan", strlen("zhangsan"));
        strncpy(zhangsan->id, "53302219861001xxxx", strlen("53302219861001xxxx"));
        strncpy(zhangsan->sex, "M", strlen("M"));
        zhangsan->age = 33;
        strncpy(zhangsan->phone, "18910108888", strlen("18910108888"));
        strncpy(zhangsan->hobby, "BasketBall, Play", strlen("BasketBall, Play"));
        strncpy(zhangsan->company, "Alibaba", strlen("Alibaba"));
    
        for(int i = 0; i < size; i++)
        {
            m_model->appendRow(*zhangsan);
        }
    
        delete zhangsan;
    }

    main.cpp文件:

    #include "MainWindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        w.generateData(1000000);
    
        return a.exec();
    }

    2、性能分析
    根据生成的不同数量规模的数据,其程序占用的内存如下:
    Qt高级——Qt数据可视化性能优化
    使用QAbstractTableModel派生类与QTableView展示数据,每条数据实际占用内存的大小是数据本身大小的1.5倍,数据量越大插入越耗时,由于底层数据结构采用链表实现,头部插入耗时与尾部追加插入耗时相当,但内存空间占用大幅下降。
    将底层数据结构换成QVector,根据生成的不同数量规模的数据,其程序占用的内存如下:
    Qt高级——Qt数据可视化性能优化
    使用QVector作为模型的底层数据结构存储数据,其内存占用与QList相当,尾部追加插入耗时与QList相当,但头部插入比QList耗时较多。

    转载于:https://blog.51cto.com/9291927/2399998

    展开全文
  • Qt数据可视化:Qt Data Visualization 与 Qt Charts 简介

    万次阅读 多人点赞 2017-11-19 21:35:16
    Qt 最近开放了不少商业许可的模块,吸纳Qt Data Visualization 与 Qt Charts 模块无疑是为了在数据可视化方面弥补框架的不足。Qt ChartsQt Charts 在Qt4时代就有了,不过一直以来是商业许可的。从5.7.0开始,也纳入...

    Qt 最近开放了不少商业许可的模块,吸纳Qt Data Visualization 与 Qt Charts 模块无疑是为了在数据可视化方面弥补框架的不足。

    Qt Charts

    Qt Charts 在Qt4时代就有了,不过一直以来是商业许可的。从5.7.0开始,Qt Charts 也纳入了开放许可证。这个Qt Charts 总体还是不错的,虽然和JS的前端库的灵活程度相比,仍然显得逊色,但对于开发重工工具软件的人来说,仍旧是一大福音。毕竟,C++/Qt也可以有原生的现代2D Plot 库了(以前靠Qwt,可是Qwt的美工实在不敢恭维)。
    感兴趣的同学可以去看看N个例子!这里是一个条形图的范例代码:

    #include <QtWidgets/QApplication>
    #include <QtWidgets/QMainWindow>
    #include <QtCharts>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //产生5个数据集
        QBarSet *set0 = new QBarSet("Jane"); set0->setLabelColor(QColor(0,0,0));
        QBarSet *set1 = new QBarSet("John"); set1->setLabelColor(QColor(96,0,0));
        QBarSet *set2 = new QBarSet("Axel"); set2->setLabelColor(QColor(0,96,0));
        QBarSet *set3 = new QBarSet("Mary"); set3->setLabelColor(QColor(0,0,96));
        QBarSet *set4 = new QBarSet("Sama"); set4->setLabelColor(QColor(0,96,96));
        *set0 << 1 << 2 << 3 << 4 << 5 << 6;
        *set1 << 5 << 0 << 0 << 4 << 0 << 7;
        *set2 << 3 << 5 << 8 << 13 << 8 << 5;
        *set3 << 5 << 6 << 7 << 3 << 4 << 5;
        *set4 << 9 << 7 << 5 << 3 << 1 << 2;
    
        //把5个数据集放入柱状图主题里
        QBarSeries *series = new QBarSeries();
        series->setLabelsVisible(true);
        series->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd);
        series->append(set0);
        series->append(set1);
        series->append(set2);
        series->append(set3);
        series->append(set4);
    
        //产生一个图标对象,注意,它其实是QGraphicsWidget的子类
        QChart *chart = new QChart();
        chart->addSeries(series);   //加入柱状图
        chart->setTitle("Simple barchart example");
        chart->setAnimationOptions(QChart::SeriesAnimations);
    
        //X轴下标
        QStringList categories;
        categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
        QBarCategoryAxis *axisX = new QBarCategoryAxis();
        axisX->append(categories);
        chart->setAxisX(axisX, series);
    
        //Y轴设置范围
        QValueAxis * axisY = new QValueAxis();
        axisY->setRange(0,20);
        chart->setAxisY(axisY, series);
    
        //图例
        chart->legend()->setVisible(true);
        chart->legend()->setAlignment(Qt::AlignBottom);
    
        //产生窗口,这个QChartView其实是QGraphicsView的子类。
        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
        //支持缩放
        chartView->setRubberBand(QChartView::RectangleRubberBand);
        QMainWindow window;
        window.setCentralWidget(chartView);
        window.resize(800, 480);
        window.show();
    
        return a.exec();
    }
    

    运行效果:
    柱状图

    Qt Data Visualization

    如果说QtCharts是2D美图的控件库,那这个Qt Data Visualization就是纯3D的了!基本上无所不包。类似Matlab中的三维plot,mesh,可以说是做数据可视化的同学的一大福音。看起来并不复杂,详细的范例和文档,是Qt的特色
    这个模块避免了用户自己创建场景。比如例子 surface中,给了一副DEM(数字高程)PNG图片:
    Moutain
    如果按照以前的想法,想显示这样的山峰,最好有Matlab或者 Octave,C++是非常复杂的。
    但是,有了这个模块后,就简单了!
    首先,用支持dem图片格式的代理,定义数据源(套路和QtChart惊人一致)

        QImage heightMapImage(":/maps/mountain");
        //成员变量为 QHeightMapSurfaceDataProxy * 类型,用于读取灰度(高程)
        m_heightMapProxy = new QHeightMapSurfaceDataProxy(heightMapImage);
        //这个是数据源,QSurface3DSeries 类似QtCharts里的series
        m_heightMapSeries = new QSurface3DSeries(m_heightMapProxy);

    而后,产生3D画布,并绑定到一个窗口:

        Q3DSurface *graph = new Q3DSurface();
        graph->setAxisX(new QValue3DAxis);
        graph->setAxisY(new QValue3DAxis);
        graph->setAxisZ(new QValue3DAxis);
        QWidget *container = QWidget::createWindowContainer(graph);

    只要为这个画布添加XYZ坐标轴(控制范围)以及数据集合,即完成了初步的显示:

            m_graph->axisX()->setRange(34.0f, 40.0f);
            m_graph->axisY()->setAutoAdjustRange(true);
            m_graph->axisZ()->setRange(18.0f, 24.0f);
            m_graph->addSeries(m_heightMapSeries);

    显示效果
    完整代码:

    #include <QtDataVisualization>
    #include <QApplication>
    #include <QtWidgets>
    #include <QScreen>
    using namespace QtDataVisualization;
    int main(int argc, char **argv)
    {
        //! [0]
        QApplication app(argc, argv);
        //读取图形
        QImage heightMapImage(":/maps/mountain");
        //成员变量为 QHeightMapSurfaceDataProxy * 类型,用于读取灰度(高程)
        QHeightMapSurfaceDataProxy *  heightMapProxy = new QHeightMapSurfaceDataProxy(heightMapImage);
        //这个是数据源,QSurface3DSeries 类似QtCharts里的series
        QSurface3DSeries * heightMapSeries = new QSurface3DSeries(heightMapProxy);
    
        //建立窗体
        Q3DSurface *graph = new Q3DSurface();
        QWidget *container = QWidget::createWindowContainer(graph);
    
        //加入主题
        graph->axisX()->setAutoAdjustRange(true);
        graph->axisY()->setAutoAdjustRange(true);
        graph->axisZ()->setAutoAdjustRange(true);
        graph->addSeries(heightMapSeries);
    
        container->show();
        return app.exec();
    }

    下面这个是完整例子,道理一样的,不过演示的效果更全面!
    Surface

    还有好多有意思的模块

    看到这两个好玩的东东,就接着翻了Qt 5.9的现有模块,真的是眼花缭乱。
    http://doc.qt.io/qt-5/qtmodules.html
    Qt Core 、Qt GUI、Qt Multimedia、Qt Multimedia Widgets、Qt Network、Qt Concurrent、
    Qt QML、Qt Quick、Qt Quick Controls、Qt Quick Dialogs、Qt Quick Layouts
    Qt SQL、Qt Test、Qt Widgets
    Qt 3D、Enginio (Deprecated)、Qt D-Bus
    Qt Android Extras、Active Qt、Qt Mac Extras、Qt Windows Extras
    Qt Bluetooth、Qt Canvas 3D
    Qt Gamepad、Qt Graphical Effects、Qt Image Formats
    Qt Location、Qt NFC、Qt OpenGL (Deprecated)
    Qt Platform Headers、Qt Positioning
    Qt Print Support、Qt Purchasing
    Qt Quick Controls 2、Qt Quick Extras
    Qt Quick Widgets、Qt Script (Deprecated)
    Qt SCXML、Qt Script Tools (Deprecated)
    Qt Sensors、Qt Serial Bus
    Qt Serial Port、Qt SVG、
    Qt WebChannel、Qt WebEngine、Qt WebSockets
    Qt WebView、Qt X11 Extras
    Qt XML、Qt XML Patterns
    Qt Wayland Compositor
    Qt Charts、Qt Data Visualization
    Qt Virtual Keyboard

    展开全文
  • Qt 数据可视化之3D图形

    万次阅读 2017-10-11 10:40:09
    前段时间在Qt事例中看到了3D图形,就参考案例,做了一个相似的demon. 不多说了,先看做的两个效果图吧。 这里主要讲解第一个,第二个的代码会打包上传。感兴趣可以下载。 工程文件: QT += data...

    前段时间在Qt事例中看到了3D图形,就参考案例,做了一个相似的demon.

    不多说了,先看做的两个效果图吧。

     

    这里主要讲解第一个,第二个的代码会打包上传。感兴趣可以下载。

    工程文件:

     

      
    
    QT += datavisualization
    
    SOURCES += main.cpp 


    因为用的是3D,所以工程文件要加datavisualization。

     

    主文件:

    #include<QWidget>

    #include <QtWidgets/QApplication>
    #include"init_widget.h"
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        Q3DBars bars;
        /*init_widget init(&bars);*/
        bars.setFlags(bars.flags() ^ Qt::FramelessWindowHint);
        bars.rowAxis()->setRange(0, 4);   //设置图形坐标范围,row
        bars.columnAxis()->setRange(0, 4);//设置图形坐标范围,colum
      //其实和cahrt模块很相似,先是创建serial,在创建数据,
    
        QBar3DSeries *series = new QBar3DSeries;
     //创建4组数据。
    
        QBarDataRow *data = new QBarDataRow;
        *data << 1.0f << 3.0f << 7.5f << 5.0f << 2.2f;
        QBarDataRow *data1 = new QBarDataRow;
        *data1 << 2.9f << 4.5f << 6.5f << 4.0f << 5.2f;
        QBarDataRow *data2 = new QBarDataRow;
        *data2 << 4.7f << 3.3f << 2.5f << 5.6f << 2.9f;
        QBarDataRow *data3 = new QBarDataRow;
        *data3 << 5.0f << 2.8f << 6.5f << 4.9 << 6.8f;
      //将数据添加进seiral中。
    
        series->dataProxy()->addRow(data);
        series->dataProxy()->addRow(data1);
        series->dataProxy()->addRow(data2);
        series->dataProxy()->addRow(data3);
       //将serial加入到3d对象中。
    
        bars.addSeries(series);
       //设置Z轴坐标
    
        QValue3DAxis *value=new QValue3DAxis;
        value->setTitle("Average temperature");//设置标题
        value->setTitleVisible(true);//记得默认是false
        value->setSegmentCount(3);//z轴分为3大段
        value->setSubSegmentCount(2);//没大段分为2个空间间隙
        value->setLabelFormat(QString(QStringLiteral("%.2f ") + "C"));//这个就不说了,,,
        value->setLabelAutoRotation(30.0f);//设置标签的角度
        bars.setValueAxis(value);
        //设置X,Y的坐标
    
        QCategory3DAxis *axis=new QCategory3DAxis;
        QStringList list;
        list<<"周一"<<"周二"<<"周三"<<"周四";
        axis->setLabels(list);
        axis->setLabelAutoRotation(30.0f);
        bars.setRowAxis(axis);
    
    
        bars.show();
        /*init.show_widget();*/
        return app.exec();
    }

    其实和chart模块很相似,

     

    1:创建3d对象,

     

    Q3DBars bars;
    

    2:创建数据串

     

     

    QBar3DSeries *series = new QBar3DSeries;

    3:添加数据

     

     

        QBarDataRow *data = new QBarDataRow;
        *data << 1.0f << 3.0f << 7.5f << 5.0f << 2.2f;
        QBarDataRow *data1 = new QBarDataRow;
        *data1 << 2.9f << 4.5f << 6.5f << 4.0f << 5.2f;
        QBarDataRow *data2 = new QBarDataRow;
        *data2 << 4.7f << 3.3f << 2.5f << 5.6f << 2.9f;
        QBarDataRow *data3 = new QBarDataRow;
        *data3 << 5.0f << 2.8f << 6.5f << 4.9 << 6.8f;

     

    4.将数据添加到数据串中

     

        series->dataProxy()->addRow(data);
        series->dataProxy()->addRow(data1);
        series->dataProxy()->addRow(data2);
        series->dataProxy()->addRow(data3);

    5:将数据串加入到3d对象中

     

     

    bars.addSeries(series);

     

     

     

    6.:显示

    bars.show();

     

     

    代码地址: https://gitee.com/kamenqing/Three_d_Demon.git

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,204
精华内容 4,881
关键字:

qt数据可视化