《Qt开发》QTableView结合QtCharts练习

1.运行效果图

 

2.功能说明:

利用Model/View结构实现左侧列表显示,表格中的数据通过定时器,实时产生[0,99]的随机数,如果随机数大于90,就设置单元格背景颜色为红色。表格中第一列设置为复选框显示,选中的项对应的位置曲线绘制在右侧的图中,绘图部分使用QtChart实现,同时绘图区域具有缩放功能

3.源码

Tableviewdemo.h程序如下:

 

#ifndef TABLEVIEWDEMO_H

#define TABLEVIEWDEMO_H

 

#include <QtWidgets/QMainWindow>

#include "ui_tableviewdemo.h"

#include <QtCharts>

#include <qstandarditemmodel.h>

#include <qitemselectionmodel.h>

#include <qlayout.h>

#include <qtimer.h>

 

using namespace QtCharts;

 

class TableViewDemo : public QMainWindow

{

    Q_OBJECT

 

public:

    TableViewDemo(QWidget *parent = 0);

    ~TableViewDemo();

 

private:

    Ui::TableViewDemoClass ui;

 

    //TableView相关变量

    QStandardItemModel *theModel;       //数据模型

    QItemSelectionModel *theSelModel;   //选择模型

    //绘图chart相关变量

    QChartView *chartView;

    QChart *chart;

    QList<QLineSeries *> seriesList;

    QValueAxis *axisX, *axisY;

    QStringList list;

    //定时器定时产生随机数

    QTimer timer;

    int count;

protected:

    void wheelEvent(QWheelEvent *event);

public:

    void InitChart();

    void InitTableView();

 

    public slots:

    void update();//更新界面显示

};

 

#endif // TABLEVIEWDEMO_H

 

Tableviewdemo.cpp程序如下:

 

#include "tableviewdemo.h"

 

//添加如下代码解决中文乱码问题

#if defined(_MSC_VER) && (_MSC_VER >= 1600) 

# pragma execution_character_set("utf-8"

#endif

 

TableViewDemo::TableViewDemo(QWidget *parent)

    : QMainWindow(parent)

    , count(0)

{

    ui.setupUi(this);

    InitTableView();

    InitChart();

    timer.setInterval(1000);

    connect(&timer,SIGNAL(timeout()),this,SLOT(update()));//定时产生随机数据更新界面

    update();

    timer.start();

}

 

TableViewDemo::~TableViewDemo()

{

 

}

 

void TableViewDemo::InitTableView()

{

    theModel = new QStandardItemModel(5,4,this);    //实例化一个3行4列的模型对象

    theSelModel = new QItemSelectionModel(theModel);//实例化一个选择模型对象

    QStringList header;

    header <<"项"<< "位置X" << "位置X2" << "位置X3";

    theModel->setHorizontalHeaderLabels(header);

    list << "汽车1" << "汽车2" << "汽车3" << "汽车4" << "汽车5";   

 

    QStandardItem   *aItem;

    for (int i = 0; i<5; i++)       //

    {

        for (int j = 0; j<4; j++)  //

        {

            if (j == 0)           //将第一列内容设置为list的值,同时设置第一列为复选框

            {

                aItem = new QStandardItem(list.at(i));

                aItem->setCheckable(true);       //设置为Checkable

                aItem->setCheckState(Qt::Checked);

                theModel->setItem(i, j, aItem); //为模型的某个行列位置设置Item

            }

            else

            {

                aItem = new QStandardItem("");  //创建item

                theModel->setItem(i, j, aItem); //为模型的某个行列位置设置Item

            }

        }

    }

 

    ui.tableView->setModel(theModel);               //为tableView设置模型

    ui.tableView->setSelectionModel(theSelModel);   //为tableView设置选择模型

    ui.tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);

    ui.tableView->setSelectionBehavior(QAbstractItemView::SelectItems);

}

void TableViewDemo::InitChart()

{

    chartView = new QChartView(ui.widget_2);

    chartView->setRubberBand(QChartView::RectangleRubberBand);

    chart = new QChart();

    chartView->setChart(chart);

    chart->setTitle("位置曲线");      //设置图表标题

    chart->legend()->setAlignment(Qt::AlignRight); //设置图例显示在右侧

    axisX = new QValueAxis;           //X

    axisY = new QValueAxis;           //Y

    axisX->setRange(0, 100);

    axisY->setRange(0, 100);

    for (int i = 0; i < 5; i++)

    {

        seriesList.append(new QLineSeries());

        seriesList.at(i)->setName(list.at(i));

        chart->addSeries(seriesList.at(i));

        chart->setAxisX(axisX, seriesList.at(i));

        chart->setAxisY(axisY,seriesList.at(i));

    }

   

    QHBoxLayout *hLayout = new QHBoxLayout;

    hLayout->addWidget(chartView);

    ui.widget_2->setLayout(hLayout);

}

 

void TableViewDemo::update()

{

    for (int i = 0; i < 5; i++)

    {

        for (int j = 1; j < 4; j++)

        {

            int temp = qrand() % 100;

            theModel->setItem(i, j, new QStandardItem(QString::number(temp)));

            if (temp>90)

                //单元格颜色设置之后不能再调用setItem,否则颜色设置将无效

                theModel->item(i, j)->setBackground(QBrush(QColor(255,0,0)));

            if (theModel->item(i, 0)->checkState() == Qt::Checked)

            {

                chart->addSeries(seriesList.at(i)); //被选择的添加除对应的序列series

                if (count>1000)

                    seriesList.at(i)->remove(0);

                seriesList.at(i)->append(count, temp);

            }

            else

            {

                chart->removeSeries(seriesList.at(i)); //未被选择的项移除对应的序列series

                seriesList.at(i)->clear();

            }              

        }

    }  

    count++;

}

 

//鼠标滚轮事件

void TableViewDemo::wheelEvent(QWheelEvent *event)

{

    if (event->delta() > 0)

        chart->zoom(1.1);

    else

        chart->zoom(0.9);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不相信眼泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值