qpainter所在的widget有自己的坐标系:X轴向右,Y轴向下。qpainter自己也有坐标系,默认和widget是重合的。但是qpainter的坐标系可以做各种变换,如平移(translate),(scale)。
先说下scale。它的作用是改变qpainter的刻度长度。来看下面代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPaintEvent>
#include <QWheelEvent>
#include <QPainter>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),m_bRect(false)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *e)
{
QPainter qp;
qp.begin(this);
qp.save();
if(m_bRect)
{
qp.scale(2,2);
qp.drawRect(0, 0, 100,100);
}
else
{
qp.setPen(QColor(255,0,0));
qp.drawRect(0, 0, 100,100);
}
qp.restore();
qp.end();
}
void MainWindow::wheelEvent(QWheelEvent *e)
{
int iColor = e->angleDelta().y() + 130;
qDebug()<<iColor<<"\n";
m_background = QColor(iColor, iColor, iColor);
update();
}
void MainWindow::mouseDoubleClickEvent(QMouseEvent *e)
{
if(Qt::LeftButton == e->button())
{
m_bRect = true;
m_pnt = e->pos();
}
update();
}
这部分代码的作用是,在程序刚启动时,在widget的左上角画一个红色正方形,边长100.启动后,假如用户用鼠标在widget上双击一次,程序又会在左上角画一个黑色正方形,边长也是100.但是注意,边长的单位都是以painter坐标系的刻度为单位的。且假如用户双击了widget,在绘制正方形之前,qt会进行如下变换:qp.scale(2,2)。这意味着尽管黑色正方形的边长也是100,但是由于qpainter的刻度已经变为原来2倍(默认qpainter的刻度和widget的刻度一样),所以黑色正方形的边长实际是红色正方形的2倍:

1万+

被折叠的 条评论
为什么被折叠?



