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)函数中进行。
- Unable to paint on Qt Widget, shows error “paintEngine: Should no longer be called”
- QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0
- 自学QT之QWidget::paintEngine: Should no longer be called的解决办法
- QWidget::paintEngines:should no longer be called.
- Echart报错 Error setOption should not be called during main process
- Subscription expires on 2017/2/25. Usage of PhpStorm will no longer be possible.
- Error:No JVM could be found on your system. Please define EXE4J_JAVA_HOME to
- node Error: Most middleware (like session) is no longer bundled with Express and must be installed
- QT:make: Nothing to be done for `first'和error:QtSql:No such file or directory
- QT:make: Nothing to be done for `first'和error:QtSql:No such file or directory
- will no longer be routine.wedding dresses
- QT-painting-paintengine
- Error: cannot be cast to android.widget.HeaderViewListAdapter
- 【Qt开发】 QT:make: Nothing to be done for `first'和error:QtSql:No such file or directory
- 编译QT项目出现错误:error C2144: syntax error : 'void' should be preceded by ';'
- Using Ogre paint Widget of QT
- QT Widget::setLayout: Attempting to set QLayout “” on Widget “”, which already has a layout
- Error 'Table './csf/tmp_excel_data' is marked as crashed and should be repaired' on opening tables
- bootstrap-table 导出 excel,pdf,txt等
- springmvc批量将文件打包成zip下载
- Head First-设计模式:工厂模式
- Hello World
- inline-block元素间隙的解决方法
- Unable to paint on Qt Widget, shows error “paintEngine: Should no longer be called”
- Runtime常用的几个应用场景
- MVC-model模型层
- java动态代理(JDK和cglib)
- 【opencv 官方教程】翻译6 Background Subtraction 和级联分类器
- 关于VC2013自动补全问题
- nyoj 一笔画(并查集)
- ZCMU—1595
- 宋仲基人气下滑?孔侑上位,衣品PK争上夺下