• 14244阅读
  • 13回复

怎么用qt实现一个直方图啊 [复制链接]

上一主题 下一主题
离线peiyiwin
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-24
如题 求教给为高手了!
不要着迷于已知
离线xtfllbl

只看该作者 1楼 发表于: 2010-05-24
paintEvent,该怎么画就怎么画,想怎么画就怎么画。

不要迷茫,就是一些线条而已,自己定好规则在画布上画就是了。
上海欢迎您
离线peiyiwin
只看该作者 2楼 发表于: 2010-05-24
我再看看手册去
谢谢1楼
不要着迷于已知
离线peiyiwin
只看该作者 3楼 发表于: 2010-05-24
1楼大侠,提示一下该怎么去画,直方图是24个小时能耗量的统计,分时段画出来
不要着迷于已知
离线peiyiwin
只看该作者 4楼 发表于: 2010-05-25
zhi fang tu hua chu lai le


zen me geng xin ne?
不要着迷于已知
离线xtfllbl

只看该作者 5楼 发表于: 2010-05-25
更新很简单,你只需要重绘就可以了,如果要隔个几秒更新什么的,就加个QTimer
上海欢迎您
离线peiyiwin
只看该作者 6楼 发表于: 2010-05-25
回 5楼(xtfllbl) 的帖子
拜问:如何用QTimer重绘?需要在类里边声明吗?
不要着迷于已知
离线xtfllbl

只看该作者 7楼 发表于: 2010-05-25
Re:回 5楼(xtfllbl) 的帖子
引用第6楼peiyiwin于2010-05-25 16:21发表的 回 5楼(xtfllbl) 的帖子 :
拜问:如何用QTimer重绘?需要在类里边声明吗?

就是一个定时器而已,隔个几秒钟做件什么事情,详情可以看文档。
上海欢迎您
离线benbenmajia

只看该作者 8楼 发表于: 2010-05-26
网上有这样的demo,你可以找找看
安然.....
离线peiyiwin
只看该作者 9楼 发表于: 2010-05-27
回 8楼(benbenmajia) 的帖子
what's demo?
sorry~
不要着迷于已知
离线xtfllbl

只看该作者 10楼 发表于: 2010-05-27
Re:回 8楼(benbenmajia) 的帖子
引用第9楼peiyiwin于2010-05-27 11:34发表的 回 8楼(benbenmajia) 的帖子 :
what's demo?
sorry~

There is a tool named Google in the world.
上海欢迎您
离线xlttap

只看该作者 11楼 发表于: 2010-05-27
给你个代码你看:
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
}

效果:
我简单我快乐
离线luoyes

只看该作者 12楼 发表于: 2010-05-28
mark
离线peiyiwin
只看该作者 13楼 发表于: 2010-06-25
回 11楼(xlttap) 的帖子
thank you very much!!
不要着迷于已知
快速回复
限100 字节
 
上一个 下一个