怎么用qt实现一个直方图啊

weixin_38051999 2019-09-19 03:01:55
如题 求教给为高手了!
...全文
367 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38114312 2019-09-19
  • 打赏
  • 举报
回复
给你个代码你看: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_OBJECTpublic:    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}效果: 图片:snap9.jpg
weixin_38126127 2019-09-19
  • 打赏
  • 举报
回复
mark

473

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧