Qt:在widget的外部进行绘制带有坐标轴的图像
2010-04-03 16:33
543 查看
=====================================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);
// }
}
#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);
// }
}
相关文章推荐
- Qt:在widget的外部进行绘制带有坐标轴的图像
- 一个 Qt 显示图片的控件(继承QWidget,使用QPixmap记录图像,最后在paintEvent进行绘制,可缩放)
- OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标
- cvDrawContours:在图像上绘制外部和内部轮廓
- qt外部数据传入实现动态的折线图绘制
- cvDrawContours:在图像上绘制外部和内部轮廓
- 初学 OpenCV 图像加载、输出+图像轮廓提取绘制并取出每个轮廓的坐标集合
- 简单的QT绘图程序(把全部的点都记录下来,然后在paintEvent里使用drawLine函数进行绘制,貌似效率很低。。。)
- Qt绘图控件qwt绘制等比例坐标图
- 基于GDI PLUS实现外部图像文件设置/绘制窗口图像
- 用opencv计算棋盘格内角点坐标(通过多个内角点获得转换矩阵),并同时用halcon和opnecv对图像进行透视变换
- IDL 直接图像法绘制直方图(自定义坐标范围,图名、坐标轴支持中文字符)
- 要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法(没有全部列
- 在qt框架中尝试用opengl绘制回波图像_20120518
- 使用matplotlib绘制图像并设置标题以及坐标轴等信息
- cvDrawContours:在图像上绘制外部和内部轮廓
- Qt之绘制折线图:图标以及坐标轴设置
- WPF中,如何使用图像API进行绘制而不是XAML?——出自《IT168》
- Mathematica 如何绘制双纵坐标轴的图像?
- python matplotlib.pyplot对图像进行绘制