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);
}