绘图的事件: void paintEvent(QPaintEvent *); 在widget.h中进行声明
声明一个画家对象:QPainter painter(this) this指定的绘图的设备
画线、圆、矩形、文字;
设置画笔和画刷;
#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::paintEvent(QPaintEvent *){
// 实例化画家对象 this 指定的是当前的设备
QPainter painter(this);
//设置画笔颜色
QPen pen(QColor(255,0,0));
//设置画笔宽度
pen.setWidth(5);
//设置风格
pen.setStyle(Qt::DotLine);
//让画家使用该画笔
painter.setPen(pen);
//画刷 用于对封闭图形上色
QBrush brush(Qt::blue);
//画刷风格
brush.setStyle(Qt::Dense7Pattern);
// 让画家使用画刷
painter.setBrush(brush);
//画线
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画圆
painter.drawEllipse(QPoint(100,100),50,50); //利用椭圆画圆
//画矩形
painter.drawRect(QRect(20,20,50,50));
//画文字
painter.drawText(QRect(10,200,400,50),"遇事不决,可问春风");
}
Widget::~Widget()
{
delete ui;
}
QPainter高级设置
#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
painter.drawEllipse(QPoint(100,100),100,100);
// 抗锯齿能力 会导致 效率低
painter.setRenderHint(QPainter::HighQualityAntialiasing,true);
painter.drawEllipse(QPoint(300,100),100,100);
painter.drawRect(QRect(20,20,50,50));
//移动画家 防止两个图在同一位置重叠
painter.translate(100,0);
//保存画家状态
painter.save();
painter.drawRect(QRect(20,20,50,50));
painter.translate(100,0);
//还原画家保存的状态
painter.restore();
painter.drawRect(QRect(20,20,50,50)); //此时这个圆会与第二个圆位置相同,两个圆重叠在一起
}
Widget::~Widget()
{
delete ui;
}
利用画家画图片
如果想手动调用绘图事件利用update();
#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击移动按钮图片移动
connect(ui->pushButton,&QPushButton::clicked,[=](){
//如果手动调用绘图事件 用update更新
pos+=20; //pos在类中定义
update(); //更新图片中pos位置按钮按下更新一次
});
}
void Widget::paintEvent(QPaintEvent *){
//**************利用画家画资源图片******************
QPainter painter(this);
//移动得如果超出屏幕就从头开始
if(pos>this->width()){
pos = 0;
}
painter.drawPixmap(pos,100,QPixmap(":/icon/iconpicture/1.png")); //pos在类中进行定义
}
Widget::~Widget()
{
delete ui;
}
Pixmap绘图设备:
对不同平台做了显示优化
#include "widget.h"
#include "ui_widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//Pixmap绘图设备 专门为了平台做了显示优化
QPixmap pix(300,300); //设定宽高
//填充颜色
pix.fill(Qt::white);
//声明画家
QPainter painter(&pix);
painter.setPen(QPen(Qt::green)); //设置画笔为绿色
painter.drawEllipse(QPoint(150,150),100,100); //画圆
//保存
pix.save("E:\\pix.png"); //将图片保存到E盘
}
Widget::~Widget()
{
delete ui;
}
QImage绘图设备(与Pixmap相似)
但是QImage可以对像素进行访问
//QImage绘图设备
QImage img(300,300,QImage::Format_RGB32);
img.fill(Qt::white);
//声明画家
QPainter painter(&img);
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150),100,100);
//保存
img.save("E:\\img.png");
利用QImage对像素点进行修改:
在widget中加入绘画事件
//绘图事件
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
//利用QImage对像素进行修改
QImage img;
img.load(":/iconpicture/1.png"); //使用img绘制资源文件
//修改像素点
for(int i = 50;i<100;i++){
for(int j = 50;j<100;j++){
QRgb value = qRgb(250,0,0); //设置一个RGB值
img.setPixel(i,j,value); //将(i,j)像素点修改为value的值
}
}
painter.drawImage(0,0,img); //在0,0点画一个img
}
QPicture绘图设备
记录和重现绘图指令,在绘图事件中可以将特殊格式的图片进行显示;
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//QPicture绘图设备 可以记录和重现绘图指令
QPicture pic;
QPainter painter;
painter.begin(&pic); //开始往pic画
painter.setPen(QPen(Qt::cyan));
painter.drawEllipse(QPoint(150,150),100,100);
painter.end(); //结束绘画
pic.save("E:\\pic.ch"); //.ch格式不能识别,绘图事件中重现该图
}
//绘图事件
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
//重现QPicture绘图指令
QPicture pic;
pic.load("E:\\pic.ch");
painter.drawPicture(0,0,pic);
}
Widget::~Widget()
{
delete ui;
}
learned from:传智教育