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
原创粉丝点击