QTQtQt绘图
xingzhu
绘图事件
绘图事件重写的情景
- 当你需要创建一个自定义控件,并且这个控件需要显示特殊的图形、颜色或形状时,重写
paintEvent
是必要的。例如,如果你需要绘制一个自定义的进度条、按钮、图表等
- 当你需要在窗口中绘制复杂的图形,或者在应用程序中实现动画时,
paintEvent
可以用来每次刷新窗口内容
示例
- 首先需要在窗口的头文件声明这方法,表示要重写
- 然后书写具体规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| void MainWindow::paintEvent(QPaintEvent *) { 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::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), "好好学习,天天向上"); }
|
高级设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawEllipse(QPoint(100,50),50,50); painter.setRenderHint(QPainter::Antialiasing); 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)); translate(150, 0); painter.restore(); }
|
利用画家画资源图片,并且实现点击按钮就移动图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); if(posX > this->width()) { posX = 0; } painter.drawPixmap(posX, 0, QPixmap(":/111.png")); }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { connect(ui->btn, &QPushButton::clicked, this, [=]() { posX += 20; update(); }); }
|
绘图设备
绘图设备简单来说就是绘图所在地,也就是画的东西画在上面
QPixmap
专门为图像在屏幕上的显示做了优化
QBitmap
是 QPixmap
的一个子类,只有黑白两种颜色
QImage
专门为图像的像素级访问做了优化,也就是可以修改图片中的像素
QPicture
是用来记录和重现 QPainter
的各条命令
- 上面的案例中在窗口画画,是因为串口是绘图设备,
MainWindow
继承 QWidget
, QWidget
继承 QObject
和 QPaintDevice
,能够在窗口上画画
QPixmap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
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");
|
QImage
1 2 3 4 5 6 7 8 9 10
| 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");
|
对像素修改例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); QImage img; img.load(":/111.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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| QPicture pic; QPainter painter;
painter.begin(&pic); painter.setPen(QPen(Qt::cyan)); painter.drawEllipse(QPoint(150,150),100,100);
painter.end();
pic.save("E:\\pic.txt");
QPainter painter1(this);
QPicture pic1; pic1.load("E:\\pic.txt"); painter.drawPicture(0, 0, pic);
|
说明:参考 https://space.bilibili.com/396491181


xingzhu
keep trying!keep doing!believe in yourself!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 星竹!