您的位置:首页 > 编程语言 > Qt开发

Qt:在widget的外部进行绘制带有坐标轴的图像

2015-12-03 00:13 609 查看


=====================================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);

// }

}

FRom;http://www.cppblog.com/biao/archive/2009/10/31/99896.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: