逛奔的蜗牛

我不聪明,但我会很努力

   ::  :: 新随笔 ::  ::  :: 管理 ::

=====================================Widget.h=====================================

#ifndef WIDGET_H

#define WIDGET_H


#include <QWidget>


namespace Ui {

    class Widget;

}


class Widget : public QWidget {

    Q_OBJECT

public:

    Widget(QWidget *parent = 0);

    ~Widget();


protected:

    virtual void changeEvent(QEvent *e);

    virtual bool eventFilter(QObject *watched, QEvent *e);

    void paintOnWidget(QWidget *w);


private:

    Ui::Widget *ui;

};


#endif // WIDGET_H



=====================================Widget.cpp=====================================

#include "Widget.h"

#include "ui_Widget.h"

#include <QtGui/QPainter>


Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {

    ui->setupUi(this);

    ui->widget->installEventFilter(this);

}


Widget::~Widget() {

    delete ui;

}


void Widget::changeEvent(QEvent *e) {

    QWidget::changeEvent(e);

    switch (e->type()) {

    case QEvent::LanguageChange:

        ui->retranslateUi(this);

        break;

    default:

        break;

    }

}


bool Widget::eventFilter(QObject *watched, QEvent *e) {

    if (watched == ui->widget) {

        if (e->type() == QEvent::Paint) {

            paintOnWidget(ui->widget);

            return true;

        }

    }


    return QWidget::eventFilter(watched, e);

}


void Widget::paintOnWidget(QWidget *w) {

    QPainter painter(w);


    QFontMetrics metrics = painter.fontMetrics();

    int textHeight = metrics.ascent() + metrics.descent();


    int leftWidth = metrics.width(tr("9000")) + 5;

    int rightWidth = metrics.width(tr("()"));

    int width = w->size().width() - leftWidth - rightWidth;

    int height = w->size().height() - 3 * textHeight;


    // 绘制外框

    painter.drawRect(0, 0, w->size().width() -1, w->size().height() - 1);

    // 移动坐标系

    //painter.translate(inset * 2, ui->yearWidget->size().height() - inset);

    painter.translate(leftWidth, 1.75 * textHeight + height);


    int totalCount = 9000; // 默认每年收入9000件衣服

    int count = 10;        // 分成10

    float deltaX = width / 12.0f;         // x坐标上每分的宽度

    float deltaY = (float)height / count; // y坐标上每分的宽度



    // 画横坐标

    painter.drawLine(0, 0, width, 0);

    for (int i = 1; i <= 12; ++i) {

        QString month = tr("%1").arg(i);

        int stringWidth = metrics.width(month);


        // 绘制坐标刻度

        painter.drawLine(deltaX * i, 0, deltaX * i, 4);


        // 绘制坐标处的月

        int monthX = deltaX * (i - 1) + ((deltaX - stringWidth) / 2);

        painter.drawText(monthX, textHeight, month);

    }


    // 画纵坐标

    painter.drawLine(0, 0, 0, -height);

    painter.drawText(-metrics.width(tr("()")),

                     -(deltaY * count + textHeight / 2 + metrics.descent()),

                     tr("()"));

    for (int i = 1; i <= count; ++i) {

        QString value = QString("%1").arg(i * totalCount / count);

        int stringWidth = metrics.width(value);


        // 绘制坐标刻度

        painter.drawLine(-4, -i * deltaY, 0, -i * deltaY);


        // 绘制坐标值

        //painter.drawText(-stringWidth - 4, -i * deltaY + stringHeight / 2, value);

        painter.drawText(-stringWidth - 4, -(deltaY * i + textHeight / 2 - metrics.ascent()), value);

    }


    //    // 绘制每个月收到的服饰

    //    painter.setBrush(Qt::BDiagPattern);

    //    for (int i = 0; i < yearList.size(); ++i) {

    //        painter.setPen(Qt::black);

    //        int fineryCount = yearList.at(i); // i + 1个月收到的服饰件数

    //        int h = fineryCount / (float)totalCount * height;

    //        painter.drawRect(deltaX * i + 2, 0, deltaX - 4, -h);

    //

    //        // 绘制收到的服饰件数

    //        QString fineryString = QString("%1").arg(fineryCount);

    //        int stringWidth = metrics.width(fineryString);

    //

    //        if (h > height) {

    //            h = height;

    //        }

    //

    //        painter.setPen(Qt::red);

    //        //painter.drawText(deltaX * i + (deltaX - stringWidth) / 2, -(h + metrics.descent()), fineryString);

    //    }

}


posted on 2009-10-31 13:38 逛奔的蜗牛 阅读(10635) 评论(13)  编辑 收藏 引用 所属分类: Qt

评论

# re: Qt:在widget的外部进行绘制带有坐标轴的图像[未登录] 2010-10-25 14:40 liu
你好
我build出现这个错误
/home/liuzhiyu/ta-build-desktop/../ta/Widget.cpp:44: error: invalid use of ‘class Ui::Widget’  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像 2010-10-25 14:49 逛奔的蜗牛
@liu
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
ui->setupUi(this);
ui->widget->installEventFilter(this);
}

看这里,需要一个widget的form,因为它是直接用QtCreator拖的。
在这个form里面,又有一个widget:ui->widget->这里就可以看到。
为了方便,就直接这样做了,关键的信息是使用EventFilter来处理绘制消息  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像[未登录] 2010-10-26 15:44 liu
我把
ui->setupUi(this);
ui->widget->installEventFilter(this);
改为
ui->setupUi(this);
this->installEventFilter(this);

后面
bool Widget::eventFilter(QObject *watched, QEvent *e) {
if (watched == ui->widget) {
if (e->type() == QEvent::Paint) {
paintOnWidget(ui->widget);
return true;
}
}

return QWidget::eventFilter(watched, e);
}
中的ui->widget也改为this就通过了  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像 2010-10-27 16:23 lily
你好,
我想将采集回来的数据(二维数组)在QT里将曲线显示出来,可不可采用你文章里的方法,还是通过在form窗体上同个Drawer类来实现。
谢谢!
刚开始学QT,雾茫茫的~~~~  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像 2010-10-27 16:27 逛奔的蜗牛
@lily
此文中的方法,是当时我处理绘制时有多个Widget,要在不同的情况对其进行绘制,所以在要不同的Widget上绘制。

如果你的数据只在一个Widget中绘制,就不需要这么麻烦,直接在一个Widget的paint方法中绘制就可以了。当然,这样做也没有任何问题。  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像 2010-10-27 16:46 lily
@逛奔的蜗牛
好的,我再想想看,谢谢你~~~  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像[未登录] 2010-10-27 22:17 liu
@lily
我的情况和你差不多 也是初学者 也是显示数据 我的QQ: 977925831
有空加我阿
  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像[未登录] 2010-10-27 22:32 liu
@逛奔的蜗牛
请问怎样绘制多个窗口的坐标图像,本文是一个窗口,多个窗口的实现,怎么办?
我想通过按钮来切换几副坐标图 楼主能不能指点迷津啊?谢谢。。。。  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像 2011-11-22 19:41 1263
在widget的外部进行绘制带有坐标轴的图像  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像[未登录] 2011-12-08 21:29 jasper
请问问题解决了没?谢谢!  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像[未登录] 2012-03-05 18:36 wang
请问加上您注释掉的那部分代码后,有个yearList变量是在哪里定义的?  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像 2014-06-26 20:35 风过不知
你的form 是指ui 里面的form layout控件吗?@逛奔的蜗牛
  回复  更多评论
  

# re: Qt:在widget的外部进行绘制带有坐标轴的图像 2014-06-26 21:24 风过不知
@liu
真理!  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理