QAbstractItemView使用整理
来源:互联网 发布:linux string 编辑:程序博客网 时间:2024/05/18 14:24
1.效果图
2.源代码
mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QStandardItemModel>#include <QTableView>#include <QMenuBar>#include <QMenu>#include <QAction>#include <QSplitter>#include "histogramview.h"class MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = 0); ~MainWindow(); void createAction();//在文件菜单中添加打开按钮 void createMenu();//创建文件按钮 void setupModel();//创建表格所有的model void setupView();//布局界面 void openFile(QString);//打开文件后将文件中的数据写入到表格private: QMenu *fileMenu;//文件菜单 QAction *openAct;//打开按钮 QStandardItemModel *model;//表格所用到的model QTableView *table;//表格 QSplitter *splitter;//界面分割用 HistogramView *histogram;//柱状图public slots: void slotOpen();//打开按钮槽函数};#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"#include <QItemSelectionModel>#include <QFileDialog>#include <QFile>#include <QTextStream>#include <QStringList>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ createAction(); createMenu(); setupModel(); setupView(); setWindowTitle(tr("View Example")); resize(600,600);}MainWindow::~MainWindow(){}void MainWindow::createAction(){ openAct = new QAction(tr("打开"),this); connect(openAct,SIGNAL(triggered()),this,SLOT(slotOpen()));}void MainWindow::createMenu(){ fileMenu = new QMenu(tr("文件"),this); fileMenu->addAction(openAct); menuBar()->addMenu(fileMenu);}void MainWindow::setupModel(){ model = new QStandardItemModel(4,4,this); model->setHeaderData(0,Qt::Horizontal,tr("部门")); model->setHeaderData(1,Qt::Horizontal,tr("男")); model->setHeaderData(2,Qt::Horizontal,tr("女")); model->setHeaderData(3,Qt::Horizontal,tr("退休"));}void MainWindow::setupView(){ splitter = new QSplitter; splitter->setOrientation(Qt::Vertical); histogram = new HistogramView(splitter); histogram->setModel(model); table = new QTableView; table->setModel(model); QItemSelectionModel *selectionModel=new QItemSelectionModel(model); table->setSelectionModel(selectionModel); histogram->setSelectionModel(selectionModel); splitter->addWidget(table); splitter->addWidget(histogram); setCentralWidget(splitter); connect(selectionModel,SIGNAL(selectionChanged(QItemSelection,QItemSelection)),table,SLOT(selectionChanged(QItemSelection,QItemSelection))); connect(selectionModel,SIGNAL(selectionChanged(QItemSelection,QItemSelection)),histogram,SLOT(selectionChanged(QItemSelection,QItemSelection)));}void MainWindow::slotOpen(){ QString name; name = QFileDialog::getOpenFileName(this,"打开",".","histogram files (*.txt)"); if (!name.isEmpty()) openFile(name);}void MainWindow::openFile(QString path){ if (!path.isEmpty()) { QFile file(path); if (file.open(QFile::ReadOnly|QFile::Text)) { QTextStream stream(&file); QString line; model->removeRows(0,model->rowCount(QModelIndex()),QModelIndex()); int row = 0; do { line = stream.readLine(); if (!line.isEmpty()) { model->insertRows(row, 1, QModelIndex()); QStringList pieces=line.split(",",QString::SkipEmptyParts); model->setData(model->index(row, 0, QModelIndex()),pieces.value(0)); model->setData(model->index(row, 1, QModelIndex()),pieces.value(1)); model->setData(model->index(row, 2, QModelIndex()),pieces.value(2)); model->setData(model->index(row, 3, QModelIndex()),pieces.value(3)); row++; } }while (!line.isEmpty()); file.close(); } }}
histogramview.h
#ifndef HISTOGRAMVIEW_H#define HISTOGRAMVIEW_H#include <QAbstractItemView>#include <QItemSelectionModel>#include <QRegion>#include <QMouseEvent>class HistogramView : public QAbstractItemView{ Q_OBJECTpublic: HistogramView(QWidget *parent=0); QRect visualRect(const QModelIndex &index)const; void scrollTo(const QModelIndex &index,ScrollHint hint=EnsureVisible); QModelIndex indexAt(const QPoint &point)const; //为selections赋初值 void setSelectionModel(QItemSelectionModel *selectionModel); QRegion itemRegion(QModelIndex index); void paintEvent(QPaintEvent *); void mousePressEvent(QMouseEvent *event);protected slots: void selectionChanged(const QItemSelection &selected,const QItemSelection &deselected); void dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight);protected: QModelIndex moveCursor(QAbstractItemView::CursorAction cursorAction,Qt::KeyboardModifiers modifiers); int horizontalOffset()const; int verticalOffset()const; bool isIndexHidden(const QModelIndex &index)const; void setSelection(const QRect &rect,QItemSelectionModel::SelectionFlags flags); QRegion visualRegionForSelection(const QItemSelection &selection)const;private: QItemSelectionModel *selections; QList<QRegion> MRegionList; QList<QRegion> FRegionList; QList<QRegion> SRegionList;};#endif // HISTOGRAMVIEW_H
histogramview.cpp
#include "histogramview.h"#include <QPainter>HistogramView::HistogramView(QWidget *parent) :QAbstractItemView(parent){ }// paintEvent()函数具体完成柱状统计图绘制的工作void HistogramView::paintEvent(QPaintEvent *){ QPainter painter(viewport()); painter.setPen(Qt::black); int x0=40; int y0=250; //y坐标轴 painter.drawLine(x0,y0,40,30); painter.drawLine(38,32,40,30); painter.drawLine(40,30,42,32); painter.drawText(20,30,tr("人数")); for(int i=1;i<5;i++) { painter.drawLine(-1,-i*50,1,-i*50); painter.drawText(-20,-i*50,tr("%1").arg(i*5)); } //x 坐标轴 painter.drawLine(x0,y0,540,250); painter.drawLine(538,248,540,250); painter.drawLine(540,250,538,252); painter.drawText(545,250,tr("部门")); int posD=x0+20; int row; for(row=0;row<model()->rowCount(rootIndex());row++) { QModelIndex index=model()->index(row,0,rootIndex()); QString dep=model()->data(index).toString(); painter.drawText(posD,y0+20,dep); posD+=50; } //男 int posM=x0+20; for(row=0;row<model()->rowCount(rootIndex());row++) { QModelIndex index=model()->index(row,1,rootIndex()); int male=model()->data(index).toDouble(); int width=10; if(selections->isSelected(index)) painter.setBrush(QBrush(Qt::blue,Qt::Dense3Pattern)); else painter.setBrush(Qt::blue); painter.drawRect(QRect(posM,y0-male*10,width,male*10)); QRegion regionM(posM,y0-male*10,width,male*10); MRegionList<<regionM; posM+=50; } //女 int posF=x0+30; for(row=0;row<model()->rowCount(rootIndex());row++) { QModelIndex index=model()->index(row,2,rootIndex()); int female=model()->data(index).toDouble(); int width=10; if(selections->isSelected(index)) painter.setBrush(QBrush(Qt::red,Qt::Dense3Pattern)); else painter.setBrush(Qt::red); painter.drawRect(QRect(posF,y0-female*10,width,female*10)); QRegion regionF(posF,y0-female*10,width,female*10); FRegionList<<regionF; posF+=50; } //退休 int posS=x0+40; for(row=0;row<model()->rowCount(rootIndex());row++) { QModelIndex index=model()->index(row,3,rootIndex()); int retire=model()->data(index).toDouble(); int width=10; if(selections->isSelected(index)) painter.setBrush(QBrush(Qt::green,Qt::Dense3Pattern)); else painter.setBrush(Qt::green); painter.drawRect(QRect(posS,y0-retire*10,width,retire*10)); QRegion regionS(posS,y0-retire*10,width,retire*10); SRegionList<<regionS; posS+=50; }}void HistogramView::dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight){ QAbstractItemView::dataChanged(topLeft,bottomRight); viewport()->update();}void HistogramView::setSelectionModel(QItemSelectionModel *selectionModel){ selections=selectionModel;}void HistogramView::selectionChanged(const QItemSelection &selected,const QItemSelection &deselected){ viewport()->update();}void HistogramView::mousePressEvent(QMouseEvent *event){ QAbstractItemView::mousePressEvent(event); setSelection(QRect(event->pos().x(),event->pos().y(),1,1),QItemSelectionModel::SelectCurrent);}void HistogramView::setSelection(const QRect &rect,QItemSelectionModel::SelectionFlags flags){ int rows = model()->rowCount(rootIndex()); int columns = model()->columnCount(rootIndex()); QModelIndex selectedIndex; for (int row=0; row<rows; ++row) { for (int column=1; column<columns; ++column) { QModelIndex index=model()->index(row,column,rootIndex()); QRegion region=itemRegion(index); if (!region.intersected(rect).isEmpty()) selectedIndex = index; } } if(selectedIndex.isValid()) selections->select(selectedIndex,flags); else { QModelIndex noIndex; selections->select(noIndex,flags); }}QModelIndex HistogramView::indexAt(const QPoint &point)const{ QPoint newPoint(point.x(),point.y()); QRegion region; foreach(region,MRegionList) // 男 列 { if (region.contains(newPoint)) { int row = MRegionList.indexOf(region); QModelIndex index = model()->index(row,1,rootIndex()); return index; } } foreach(region,FRegionList) // 女 列 { if (region.contains(newPoint)) { int row = FRegionList.indexOf(region); QModelIndex index = model()->index(row,2,rootIndex()); return index; } } foreach(region,SRegionList) // 合计 列 { if (region.contains(newPoint)) { int row = SRegionList.indexOf(region); QModelIndex index = model()->index(row,3,rootIndex()); return index; } } return QModelIndex();}QRect HistogramView::visualRect(const QModelIndex &index)const{}void HistogramView::scrollTo(const QModelIndex &index,ScrollHint){}QModelIndex HistogramView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers){}int HistogramView::horizontalOffset()const{}int HistogramView::verticalOffset()const{}bool HistogramView::isIndexHidden(const QModelIndex &index)const{}QRegion HistogramView::visualRegionForSelection(const QItemSelection &selection)const{}QRegion HistogramView::itemRegion(QModelIndex index){ QRegion region; if (index.column() == 1) // 男 region = MRegionList[index.row()]; if (index.column() == 2) // 女 region = FRegionList[index.row()]; if (index.column() == 3) // 退休 region = SRegionList[index.row()]; return region;}
文件内容:
一部,12,3,5二部,16,4,0三部,18,4,2四部,10,3,1五部,11,4,3六部,12,2,4七部,14,3,5八部,9,1,1
阅读全文
0 0
- QAbstractItemView使用整理
- QAbstractItemView
- QAbstractItemView,QTableView
- QAbstractItemView为截断的项显示ToolTip(使用事件过滤)
- QAbstractItemView类参考
- Custom QAbstractItemView must implement functions
- Qt之QAbstractItemView右键菜单
- QComboBox中QAbstractItemView宽度设置
- Qt QAbstractItemView为截断的项显示ToolTip
- EXISTS的使用(整理)
- mysql使用心得整理
- solr使用整理
- ant使用整理
- sh脚本使用整理
- Dozer使用 整理
- Dozer使用 整理2
- FCKEditor 使用整理
- Wix使用整理(一)
- Android笔记(6)扫描二维码
- Java运算符结合性
- Java经典算法40例(二十六)
- js取随机数
- Photon学习笔记(二)
- QAbstractItemView使用整理
- 暑期项目开发实训 Day19
- 2、匿名内部类在开发中的使用
- js学习笔记--数组遍历forEach
- MySQL 存储过程的那点知识
- Java经典算法40例(二十七)
- 集体智慧编程学习笔记(1)——机器学习定义
- bzoj 2705: [SDOI2012]Longge的问题(欧拉函数)
- 循环问题