QT绘画 QPainter
重载 paintEvent
准备画笔
QPainter p(this); p.setPen(QPen(Qt::red, 2, Qt::DashLine)); p.setBrush(Qt::yellow); // 背景颜色 p.setFont(QFont("aaa", 40, 700, true)); //italic绘制形状
p.drawLine(QPoint(0,0), QPoint(100,100)); p.drawRect(QRect(40,60,100,50)); p.drawText(QPoint(300, 50), "Hellow"); p.drawPixmap(QPoint(40,40), QPixmap("../aaa.png"));图形变换
{ QTransform transfrom; // 可将复杂的功能组合 transfrom.rotate(30); transfrom.scale(.5,.5); // 缩放 p.setTransform(transfrom); // 旋转 } p.translate(100,100); // 变换原点坐标单独消除锯齿
p.setRenderHint(QPainter::Antialiasing); // 消除锯齿*可以先画好图片放入pixmap中,再在窗口绘制
QPixmap pixmap(size()); QPainter p(&pixmap); QTransform transform; transform.translate(50,50); transform.rotate(30); p.setTransform(transform); p.drawxxx ... ... P.end(); p.begin(this); p.drawPixmap(0,0,pixmap);
示例1(画板实现)
// MyWidget.h
#include<QVector>
#include <QDebug>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
MyButton * button;
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
QVector<QPoint> _pos;
QVector< QVector<QPoint> > _lines;
signals:
};
//MyWidget.cpp
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
for(int i = 0; i < _lines.size();++i)
{
const QVector<QPoint> & line = _lines.at(i);
{
for(int j = 0; j < line.size()-1; ++j)
{
p.drawLine(line.at(j),line.at(j+1));
}
}
}
}
void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
if(_lines.size() == 0)
{
QVector<QPoint> line;
_lines.append(line);
}
QVector<QPoint>& lastline = _lines.last();
lastline.append(event->pos());
// _pos.append(event->pos());
update();
}
void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
QVector<QPoint>& lastline = _lines.last();
lastline.append(event->pos());
// _pos.append(event->pos());
}
void MyWidget::mousePressEvent(QMouseEvent *event)
{
QVector<QPoint> line; // 一条线
_lines.append(line); // 一条线放入很多条线 的向量里
QVector<QPoint>& lastline = _lines.last();
lastline.append(event->pos());
// _pos.append(event->pos());
}
示例2 按钮变色
// MyButton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QWidget>
#include <QMouseEvent>
class MyButton : public QWidget
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = nullptr);
MyButton(const QString &text, QWidget* parent = 0);
QRect _rect; // 按钮大小
QString _text; // 按钮显示文字
bool _pressed; // 按压判断
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
signals:
void clicked();
};
#endif // MYBUTTON_H
// MuButton.cpp
#include "MyButton.h"
#include <QPainter>
MyButton::MyButton(QWidget *parent) :
QWidget(parent), _rect(0,0,100,30)
{
_pressed = false; // 初始时 按压设置为否
this->setGeometry(_rect);
}
MyButton::MyButton(const QString &text, QWidget *parent):
QWidget(parent), _text(text), _rect(0,0,100,30)
{
_pressed = false;
this->setGeometry(_rect);
}
void MyButton::paintEvent(QPaintEvent *event)
{
QPainter p(this);
if( _pressed == true )
{
p.setBrush(Qt::yellow); // 设置背景为黄色
}
else
p.setBrush(Qt::darkGray); // 设置背景为灰色
p.drawRect(_rect); // 画按钮框
p.drawText(_rect, _text, QTextOption(Qt::AlignCenter)); // 画文字
}
void MyButton::mousePressEvent(QMouseEvent *event)
{
// 按下时 按钮状态为 true 更新颜色
_pressed = true;
update();
}
void MyButton::mouseReleaseEvent(QMouseEvent *event)
{
// 释放时 按钮状态为 false 更新颜色
_pressed = false;
update();
// 在设定框框的容器范围内才发送信号
if(_rect.contains(event->pos()))
{
emit clicked();
}
// emit clicked();
}