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

来源:互联网 发布:带网络驱动精灵 编辑:程序博客网 时间:2024/05/22 06:54

今天在使用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)函数中进行。

0 0
原创粉丝点击