有时候想在QWidget的其它函数中绘制图形或输出文字,如果直接用QPainter painter(QWidget*) 去绘制,往往得不到想要的结果,因为paintEvent会把之前的绘制结果擦出。
如何做才能克服之个困难呢?QWidget类中提供一个函数 windowHandle()取得QWindow对象指针。在QWindow对象上绘制,即能达想要的结果。
下面演示一下,在timerEvent()中绘制图形和文字。
直接上代码。
```cpp
```cpp
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
m_backingStore= nullptr;
this->startTimer(100);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
paintWidget(painter);
}
void MyWidget::timerEvent(QTimerEvent* event)
{
if(this->windowHandle() == nullptr)
{
return;
}
static int flag = 0;
if(flag < 2)
{
flag ++;
return;
}
if (!windowHandle()->isExposed())
return;
QRect rect(0, 0, width(), height());
m_backingStore = new QBackingStore(this->windowHandle());
m_backingStore->resize(QSize(this->width(), this->height()));
m_backingStore->beginPaint(rect);
QPaintDevice *device = m_backingStore->paintDevice();
QPainter painter(device);
paintWidget(painter);
m_backingStore->endPaint();
m_backingStore->flush(rect);
}
void MyWidget::paintWidget(QPainter& painter)
{
painter.fillRect(0, 0, width(), height(), Qt::white);
painter.drawText(100,100, "不在QWidget的paintEvent()函数环境中绘制文字!");
}