wyk22293636 2019-05-31 17:53 采纳率: 0%
浏览 8468
已结题

Qt 如何清除在窗口上已画的图形

首先我将主窗口设置为透明:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowOpacity(1);
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    ....

然后我希望在主窗口上画各种图形(直线,圆等),检测鼠标左键按下,记录第一个点位置,然后鼠标移动时可以从第一个点的位置画一条到当前位置的直线,大致代码如下:

void MainWindow::mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton) {
        firstPnt = e->pos();
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
    QPoint pnt = e->pos();
    curPnt.setX(e->x());
    curPnt.setY(e->y());
    this->repaint(0, 0, 1920, 1080);
}

我的主窗口是1920*1080,调用repaint后会执行paintEvent:

void MainWindow::paintEvent(QPaintEvent *e)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setPen(QPen(Qt::black, 4, Qt::SolidLine, Qt::RoundCap)); 
    painter.drawLine(firstPnt.x(), firstPnt.y(), curPnt.x(), curPnt.y()); 
}

但是repaint并没有把原先的图形清除掉,而且鼠标移动画图过程非常卡顿,有什么好的方法么,我才接触QT不到一星期,大佬帮帮忙。

  • 写回答

2条回答 默认 最新

  • hzxt 2019-06-04 09:43
    关注

    不建议这种实现,鼠标微微移动就重画,这样不停的画很卡,建议坐标差异大于多少像素才重画,就是void MainWindow::mouseMoveEvent(QMouseEvent *e)事件中增加和firstPoint点的距离判断
    至于清除整个图形,建议使用双缓存技术,可以参考下面链接
    http://bubuko.com/infodetail-2962196.html

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题