Qt学习基础之绘图事件#ifndef WIDGET

mac2026-01-11  7

一、QPainter绘图 

绘图事件 void paintEvent()声明一个画家对象 QPainter painter(this) this 指定绘图设备画线、画圆、画矩形、画文字设置画笔 QPen  设置画笔宽度、风格设置画刷 QBrush 设置画刷 风格 //实例化画家对象 this指定的是绘图设备 QPainter painter(this); //设置画笔 QPen pen(QColor(255,0,0)); pen.setWidth(3); pen.setStyle(Qt::DotLine); painter.setPen(pen); //设置画刷 QBrush brush(Qt::cyan); //让画家使用画刷 brush.setStyle(Qt::Dense1Pattern); 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),"好好学习,天天向上");

二、QPainter高级设置

抗锯齿 效率低painter.setRenderHint(QPainter::Antialiasing);对画家进行移动 painter.translate(100,0);  保存状态 save还原状态 restore QPainter painter(this); //设置 抗锯齿能力 效率较低 painter.setRenderHint(QPainter::Antialiasing); painter.drawEllipse(QPoint(100,50),50,50); painter.drawEllipse(QPoint(200,50),50,50); //画矩形 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));

 三、手动调用绘图事件

如果下想手动调用绘图事件 利用 update

利用画家画图片 painter.drawPixmap(x,y,QPixmap("图片路径");

void Widget::paintEvent(QPaintEvent *) { //实例化画家对象 this指定的是绘图设备 QPainter painter(this); if(posX > this->width()) { posX = 0; } painter.drawPixmap(posX,0,QPixmap("E:\\picture\\FireFox.png")); } //按钮转到槽 void Widget::on_pushButton_clicked() { posX+=10; update(); }

四、绘图设备

QPainter-> QPaintEngine->QPaintDevice

Qt的绘图系统实际上是,使用QPainter在QPainterDevice上进行绘制,它们之间使用QPainterEngine进行通讯(也就是翻译QPainter的指令)

绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage、QPicture.其中

QPixmap专门为图像在屏幕上的显示做了优化QBitmap是QPixmap的一个子类,它的色深限定为1,可以用QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmapQImage专门为图像的像素级访问做了优化QPicture则可以记录和重现QOPainter的各条命令

QPixmap是针对屏幕进行特殊优化,它实际的底层显示设备息息相关。 

QPixmap继承了QPaintDevice,你可以使用QPainter直接在上面绘制图形。QPixmap也可以接受一个字符串作为一个文件的路径来显示这个文件,比如你想在程序之中打开png、jpeg之类的文件,就可以使用QPixmap。使用QPainter的DrawPixmap()函数可以把这个文件绘制到一个QLabel、QPushButton或者其它的设备上面。

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPaintEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); // //绘图事件 void paintEvent(QPaintEvent *); // int posX=0; private slots: // void on_pushButton_clicked(); private: Ui::Widget *ui; }; #endif // WIDGET_H #include "widget.h" #include "ui_widget.h" #include <QPainter> #include <QPixmap> #include <QImage> #include <QPicture> 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("F://pix.png"); //QImage绘图设备 可以对像素进行访问 // QImage img(300,300,QImage::Format_ARGB32); // img.fill(Qt::white); // //声明画家 // QPainter painter(&img); // painter.setPen(QPen(Qt::yellow)); // painter.drawEllipse(QPoint(150,150),100,100); // img.save("F://img.png");//保存 //QPicture 绘图设备 可以记录和重现绘图指令 QPicture pic; QPainter painter; painter.begin(&pic); painter.setPen(QPen(Qt::cyan)); painter.drawEllipse(QPoint(150,150),100,100); painter.end();//结束画画 pic.save("F:\\pic.zt");//任意后缀名 } Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent *) { //实例化画家对象 this指定的是绘图设备 // QPainter painter(this); // //设置画笔 // QPen pen(QColor(255,0,0)); // pen.setWidth(3); // pen.setStyle(Qt::DotLine); // painter.setPen(pen); // //设置画刷 // QBrush brush(Qt::cyan); // //让画家使用画刷 // brush.setStyle(Qt::Dense1Pattern); // 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),"好好学习,天天向上"); // QPainter painter(this); // //设置 抗锯齿能力 效率较低 // painter.setRenderHint(QPainter::Antialiasing); // painter.drawEllipse(QPoint(100,50),50,50); // painter.drawEllipse(QPoint(200,50),50,50); // //画矩形 // 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)); // QPainter painter(this); // if(posX > this->width()) // { // posX = 0; // } // painter.drawPixmap(posX,0,QPixmap("E:\\picture\\FireFox.png")); // QPainter painter(this); // //利用QImage 对像素进行修改 // QImage img; // img.load("E:\\picture\\stop.png"); // //修改像素点 // 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); //重现QPicture的绘图指令 QPainter painter(this); QPicture pic; pic.load("F:\\pic.zt");//加载出来,重现图片 painter.drawPicture(0,0,pic); } //void Widget::on_pushButton_clicked() //{ // posX+=10; // update(); //}

 

最新回复(0)