Unable to paint on Qt Widget, shows error “paintEngine: Should no longer be called”

今天在使用QPainter的时候QPainter不起作用,同时出现了如下错误:

QWidget::paintEngine: Should no longer be called

QPainter::begin: Paint device returned engine == 0, type: 1

QPainter::setPen: Painter not active

QPainter::drawPoints: Painter not active


我的部分代码如下:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    painter = new QPainter(this);
    index = 0;
}

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

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    //qDebug() << event->pos();
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    painter->setPen(QPen(Qt::red, 2, Qt::SolidLine));
    painter->drawPoint(50 + index, 50 + index);
}

经过谷歌知道了错误的原因:

All painting on a widget must happen in the paintEvent() function, and you are trying to paint outside of it - that won't work.

You must either find a way to put all your drawing calls inside the paintEvent() function, or draw on a buffer, for example a QPixmap and then draw that pixmap onto the widget in the paintEvent() When you draw on a buffer you can draw from everywhere, the limitation is only for widget drawing. For pixmaps you (usually) must draw from the main thread, if you want to draw from another thread, use QImage instead.

于是将代码修改为:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    index = 0;
}

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

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    //qDebug() << event->pos();
}

void Widget::mousePressEvent(QMouseEvent *event)
{
//    painter->drawPoint(50 + index, 50 + index);
    update();
}

void Widget::paintEvent(QPaintEvent *event)
{
    painter = new QPainter(this);
    painter->setPen(QPen(Qt::red, 2, Qt::SolidLine));
    painter->drawPoint(50 + index, 50 + index);
    index += 50;
}

就可以正常工作了,注意QPainter的内存分配也必须在 Widget :: paintEvent ( QPaintEvent *event)函数中进行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值