qt 清除模式的应用以及动态绘制

问题描述

在现实中,我们经常需要动态的去更新屏幕上的数字或者下标等,但是 qt 中没有直接的方法,一般都是通过先擦除,然后再绘制新的数字下标等。

在擦除模式后,我们还是需要动态绘制在之前的图片上,所以需要切换回原来的模式。这个很重要,不然无法绘制。

因为是动态增量绘制,所以需要 pixmap 为成员变量,后续的绘制都在 pixmap 上。

cpp 复制代码
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QPainter>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),pixmap(1000,1000)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    oldX = 150;
    oldY = 150;
    count = 0;
    updated = false;
}

void MainWindow::paintEvent(QPaintEvent *event){
    QPainter p(this);

    if(!updated){
        // QPainter painter(&pixmap);
        // qDebug()<<painter.compositionMode() << "helloworld";
        // painter.setPen(QPen(Qt::green));
        // painter.drawEllipse(QPoint(150,150),20,20);

        // painter.drawText(QRect(240, 45, 270, 60), "2");


        // p.drawPixmap(0,0,pixmap);
    }

    if (updated)
    {

        QPainter painter(&pixmap);

        painter.setPen(QPen(Qt::green));
        //painter.setCompositionMode(QPainter::CompositionMode_Xor);

        int x = oldX + count;
        int y = oldY + count;

        int r = 20;
        painter.drawEllipse(QPoint(x,y),r,r);

        painter.setCompositionMode(QPainter::CompositionMode_Clear);
        painter.fillRect(oldX + r -5, oldY + 100 - 5, oldX + r + 5, oldY + r + 5, Qt::white); // 清除局部区域



        painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
        painter.drawText(QRect(x + r -5, y + 100 - 5, x + r + 5, y + r + 5), QString::number(count));


        oldX = x;
        oldY = y;

        p.drawPixmap(0,0,pixmap);
        updated = false;

    }
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{

    qDebug()<<"hello";
    count += 20;
    this->updated = true;


    this->update();

}
相关推荐
☆璇44 分钟前
【数据结构】排序
c语言·开发语言·数据结构·算法·排序算法
我要成为c嘎嘎大王44 分钟前
【C++】初识C++(1)
开发语言·c++
良木林1 小时前
JavaScript书写基础和基本数据类型
开发语言·前端·javascript
艾莉丝努力练剑4 小时前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
还债大湿兄5 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
倔强青铜38 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian8 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼9 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上9 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
xingshanchang9 小时前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab