给你个代码你看:
H文件
/*
* HistogramView.h
*
* Created on: 2009-9-8
* Author: xlttap
*/
#ifndef HISTOGRAMVIEW_H_
#define HISTOGRAMVIEW_H_
#include <QAbstractItemView>
#include <QModelIndex>
#include <QRect>
#include <QRegion>
#include <QList>
class QWidget;
class QPoint;
class QMouseEvent;
class QPaintEvent;
class QItemSelectionModel;
class QItemSelection;
class HistogramView : public QAbstractItemView
{
Q_OBJECT
public:
HistogramView(QWidget *parent = 0);
virtual ~HistogramView();
public:
QRect visualRect(const QModelIndex &index) const;
void scrollTo(const QModelIndex &index,ScrollHint hint = EnsureVisible);
QModelIndex indexAt(const QPoint &point) const;
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void setSelectionModel(QItemSelectionModel *selectionModel);
QRegion itemRegion(QModelIndex index);
protected slots:
void dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight);
void selectionChanged(const QItemSelection &selected,const QItemSelection &deselected);
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> listRegionM;
QList<QRegion> listRegionF;
QList<QRegion> listRegionS;
};
#endif /* HISTOGRAMVIEW_H_ */
CPP文件
/*
* HistogramView.cpp
*
* Created on: 2009-9-8
* Author: xlttap
*/
#include <QtGui>
#include "HistogramView.h"
void HistogramView::paintEvent(QPaintEvent *event)
{
QPainter painter(this->viewport());
painter.setPen(Qt::black);
int x0 = 40;
int y0 = 250;
// draw y axis
painter.drawLine(x0,y0,40,30);
painter.drawLine(38,32,40,30);
painter.drawLine(40,30,42,32);
painter.drawText(20,30,tr("number"));
for(int i = 0; i < 5; i++) {
// painter.drawLine(-1,-i*50,1,-i*50);
// painter.drawText(-20,-i*50,tr("%1").arg(i*5));
painter.drawLine(x0-2,y0-i*50,x0,y0-i*50);
painter.drawText(x0-20,y0-i*50,tr("%1").arg(i*5));
}
// draw x axis
painter.drawLine(x0,y0,540,250);
painter.drawLine(538,248,540,250);
painter.drawLine(540,250,538,252);
painter.drawText(545,250,tr("department"));
int row;
// name of variable of x axis
int posD = x0 + 20;
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;
}
// histogram of male
int posM = x0+20;
for(row = 0; row < model()->rowCount(rootIndex());row++) {
bool ok;
QModelIndex index = model()->index(row,1,rootIndex());
int male = model()->data(index).toInt(&ok);
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);
listRegionM << regionM;
posM += 50;
}
// histogram of female
int posF = x0+30;
for(row = 0; row < model()->rowCount(rootIndex());row++) {
QModelIndex index = model()->index(row,2,rootIndex());
int female = model()->data(index).toInt();
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);
listRegionF << regionF;
posF += 50;
}
// histogram of retire
int posS = x0+40;
for(row = 0; row < model()->rowCount(rootIndex());row++) {
QModelIndex index = model()->index(row,3,rootIndex());
int sum = model()->data(index).toInt();
int width = 10;
if(selections->isSelected(index))
painter.setBrush(QBrush(Qt::green,Qt::Dense3Pattern));
else
painter.setBrush(Qt::green);
painter.drawRect(QRect(posS,y0-sum*10,width,sum*10));
QRegion regionS(posS,y0-sum*10,width,sum*10);
listRegionS << 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 = 0; column < columns; column++) {
QModelIndex index = model()->index(row,column,rootIndex());
QRegion region = itemRegion(index);
if(!(region.intersected(contentsRect()).isEmpty()))
selectedIndex = index;
}
}
if(selectedIndex.isValid())
selections->select(selectedIndex,flags);
else {
QModelIndex noIndex;
selections->select(noIndex,flags);
}
}
QRegion HistogramView::itemRegion(QModelIndex index)
{
QRegion region;
if(index.column() == 1) // male
region = listRegionM[index.row()];
if(index.column() == 2) // female
region = listRegionF[index.row()];
if(index.column() == 3) // retire
region = listRegionS[index.row()];
return region;
}
QModelIndex HistogramView::indexAt(const QPoint &point) const
{
QPoint newPoint(point.x(),point.y());
QRegion region;
foreach(region,listRegionM) { // Male Column
if(region.contains(newPoint)) {
int row = listRegionM.indexOf(region);
QModelIndex index = model()->index(row,1,rootIndex());
return index;
}
}
foreach(region,listRegionF) { // Female Column
if(region.contains(newPoint)) {
int row = listRegionF.indexOf(region);
QModelIndex index = model()->index(row,2,rootIndex());
return index;
}
}
foreach(region,listRegionS) { // Retire Column
if(region.contains(newPoint)) {
int row = listRegionS.indexOf(region);
QModelIndex index = model()->index(row,3,rootIndex());
return index;
}
}
return QModelIndex(); //null, returns an invalid model index
}
QModelIndex HistogramView::moveCursor(QAbstractItemView::CursorAction cursorAction,Qt::KeyboardModifiers modifiers) {}
int HistogramView::horizontalOffset() const {}
int HistogramView::verticalOffset() const {}
bool HistogramView::isIndexHidden(const QModelIndex &index) const {}
QRect HistogramView::visualRect(const QModelIndex &index) const {}
void HistogramView::scrollTo(const QModelIndex &index, ScrollHint hint) {}
QRegion HistogramView::visualRegionForSelection(const QItemSelection &selection) const {}
HistogramView::HistogramView(QWidget *parent) : QAbstractItemView(parent)
{
// TODO Auto-generated constructor stub
}
HistogramView::~HistogramView() {
// TODO Auto-generated destructor stub
}
效果: