不在QWidget的paintEvent()函数中如何绘制图形

有时候想在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()函数环境中绘制文字!");
}

工程下载

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值