揚(yáng)州公司做網(wǎng)站公司手游推廣平臺(tái)代理
一、QPainter繪圖
繪圖事件????????void paintEvent()
聲明一個(gè)畫家對(duì)象,OPainter painter(this)????????this指定繪圖設(shè)備
畫線、畫圓、畫矩形、畫文字
設(shè)置畫筆QPen????????設(shè)置畫筆寬度、風(fēng)格設(shè)置畫刷QBrush????????設(shè)置畫刷風(fēng)格
代碼示例:
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//畫家類Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}void Widget::paintEvent(QPaintEvent *){//實(shí)例化畫家對(duì)象 this指定的是繪圖的設(shè)備QPainter painter(this);//設(shè)置畫筆QPen pen(QColor(255,0,0));//設(shè)置畫筆風(fēng)格pen.setStyle(Qt::DotLine);//設(shè)置畫筆寬度pen.setWidth(3);//讓畫家使用這個(gè)筆painter.setPen(pen);//設(shè)置畫刷-->填充顏色QBrush brush(Qt::cyan);//設(shè)置畫刷風(fēng)格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,150,50),"好好學(xué)習(xí),天天向上");}Widget::~Widget()
{delete ui;
}
輸出如下所示:
?
二、QPainter高級(jí)設(shè)置
抗鋸齒????????效率低
painter.setRenderHint(QPainter::Antialiasing);對(duì)畫家進(jìn)行移動(dòng)
????????painter.translate(100,0);????????保存狀態(tài)save
????????還原狀態(tài)restore
代碼示例:?
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//畫家類Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}void Widget::paintEvent(QPaintEvent *){//高級(jí)設(shè)置///QPainter painter(this);
// painter.drawEllipse(QPoint(100,50),50,50);
// //設(shè)置抗鋸齒能力 效率低
// painter.setRenderHint(QPainter::Antialiasing);
// painter.drawEllipse(QPoint(200,50),50,50);//畫矩形painter.drawRect(QRect(20,20,50,50));//移動(dòng)畫家painter.translate(100,0);//保存畫家狀態(tài)painter.save();painter.drawRect(QRect(20,20,50,50));painter.translate(100,0);//還原畫家保存狀態(tài)painter.restore();painter.drawRect(QRect(20,20,50,50));}Widget::~Widget()
{delete ui;
}
三、手動(dòng)調(diào)用繪圖事件
如果想手動(dòng)調(diào)用繪圖事件利用update()
利用畫家畫圖片painter.drawPixmap( x, y,QPixmap(路飛))
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//繪圖事件void paintEvent(QPaintEvent *);int posX = 0;private:Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp?
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//畫家類Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//點(diǎn)擊移動(dòng)按鈕,移動(dòng)圖片connect(ui->pushButton,&QPushButton::clicked,[=](){posX += 20;//如果要手動(dòng)調(diào)用繪圖事件 用update更新update();});
}void Widget::paintEvent(QPaintEvent *){///利用畫家 畫資源圖片//QPainter painter(this);//如果超出屏幕從0開(kāi)始if(posX > this->width()){posX = 0;}painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));}Widget::~Widget()
{delete ui;
}
輸出如下所示:(當(dāng)超出屏幕時(shí)從0開(kāi)始)
利用定時(shí)器讓其自動(dòng)從左到右移動(dòng):?
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//畫家類
#include<QTimer>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//點(diǎn)擊移動(dòng)按鈕,移動(dòng)圖片connect(ui->pushButton,&QPushButton::clicked,[=](){posX += 20;//如果要手動(dòng)調(diào)用繪圖事件 用update更新update();});//實(shí)現(xiàn)自動(dòng)讓圖片向右移動(dòng)QTimer *timer = new QTimer(this);timer->start(10);connect(timer,&QTimer::timeout,[=](){posX++;update();});
}void Widget::paintEvent(QPaintEvent *){///利用畫家 畫資源圖片//QPainter painter(this);//如果超出屏幕從0開(kāi)始if(posX > this->width()){posX = 0;}painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));}Widget::~Widget()
{delete ui;
}
四、繪圖設(shè)備
1. QPixmap Qlmage QBitmap(黑白色) QPicture Qwidget
2. QPixmap對(duì)不同平臺(tái)做了顯示的優(yōu)化
????????QPixmap pix( 300,300)
????????pix.fill(填充顏色)
????????利用畫家往pix 上畫畫? ? ? ? QPainter painter( & pix)????????保存pix.save(“路徑")
3. Qimage可以對(duì)像素進(jìn)行訪問(wèn)
????????使用和QPixmap差不多 Qlmage img(300,300,Qlmage::Format_RGB32);????????其他流程和QPixmap一樣
????????可以對(duì)像素進(jìn)行修改img.setPixel(i,j,value);
代碼示例:
#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// //Pixmap繪圖設(shè)備 專門為平臺(tái)做了顯示的優(yōu)化
// 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("D:\\QT\\pix.png");//QImage繪圖設(shè)備 可以對(duì)像素進(jìn)行訪問(wèn)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("D:\\QT\\img.png");
}Widget::~Widget()
{delete ui;
}
QPixmap和Qimage輸出如下所示為:
? ? ? ? ? ? ? ?
?
Qimage修改像素點(diǎn):
#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}//繪圖事件
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//利用QImage 對(duì)像素進(jìn)行修改QImage img;img.load(":/image/Luffy.png");//修改像素點(diǎn)for(int i = 50; i < 100; i++){for(int j = 50; j<100;j++){QRgb value = qRgb(255,0,0);img.setPixel(i,j,value);}}painter.drawImage(0,0,img);
}Widget::~Widget()
{delete ui;
}
輸出對(duì)比如下所示:?
? ? ?
4. QPicture記錄和重現(xiàn)繪圖指令
????????QPicture pic
????????painter.begin(&pic);
????????保存:pic.save(任意后綴名)????????重現(xiàn):利用畫家可以重現(xiàn)????????painter.drawPicture(0,0,pic);
代碼示例:?
#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>
#include<QPicture>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//QPicture繪圖設(shè)備 可以記錄和重現(xiàn)繪圖指令QPicture pic;QPainter painter;painter.begin(&pic);//開(kāi)始往pic上畫painter.setPen(QPen(Qt::cyan));painter.drawEllipse(QPoint(150 ,150),100,100);painter.end();//結(jié)束畫畫//保存到磁盤pic.save("D:\\QT\\pic.zt");
}//繪圖事件
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//重現(xiàn)繪圖指令QPicture pic;pic.load("D:\\QT\\pic.zt");painter.drawPicture(0,0,pic);
}Widget::~Widget()
{delete ui;
}
輸出如下所示:?