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