解决QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine

标题问题同时在运行后会附带以下问题:

QPainter::setPen: Painter not active
QPainter::font: Painter not active
QPainter::setFont: Painter not active

QWidget::paintEngine: Should no longer be called

QPainter::begin: Paint device returned engine == 0, type: 1

以上问题的解决办法就是在绘图事件函数内创建画家基本即可解决,前提是你是想要在父窗口进行图像绘制。

        父窗口:绘制图像,需要继承QWidget类然后重写绘图事件,最后在绘图事件函数内创建画家即可。(构造函数内不要创建画家

.h

protected:
    void paintEvent(QPaintEvent *event)override;

.cpp

void CWidget::paintEvent(QPaintEvent *event)
{
    QPainter thePainter(this);
    drawText(thePainter);
    event->accept();
}

 父窗口内的小部件:绘制图像,需要安装事件过滤器,将父窗口的事件传入到小部件中,由小部件来执行该事件

ui.widget->installEventFilter(this);

安装完事件过滤器后,重写事件过滤器函数,在创建画家时记得把小部件对象给到画家。

protected:
    void paintEvent(QPaintEvent *event)override;
    bool eventFilter(QObject *watched, QEvent *event);
bool CWidget::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == ui.widget && event->type() == QEvent::Paint)
    {
        drawText();
        return true;
    }
    return QWidget::eventFilter(watched, event);
}

即QPainter thePainter(ui.widget);

void CWidget::drawText()
{
    QPainter thePainter(ui.widget);
    thePainter.setPen(QColor::fromRgb(253, 210, 8));
    QFont myFont = thePainter.font();
    myFont.setPointSize(10);
    myFont.setBold(true);
    QFontMetrics myFontMetrics(myFont);
    QRect myWinRect = rect();
    int width = myWinRect.width();
    int height = myWinRect.height();
 
    int myOffset = myFont.pointSize();
 
    thePainter.setFont(myFont);
    QRect myRect = myFontMetrics.boundingRect(u8"祖国统一");
    thePainter.drawText(myWinRect.width()*0.3f, myRect.height() + myOffset, u8"祖国统一");
}

完成代码代码如下:

CWidget.h

#pragma once
 
#include <QtWidgets/QWidget>
#include "ui_CWidget.h"
#include <QString>
#include <QDebug>
#include <QPainter>
#include <QTimer>
#include <QPaintEvent>
#include <QFontMetrics>
#include <QPaintEvent>
 
class CWidget : public QWidget
{
    Q_OBJECT
 
public:
    CWidget(QWidget *parent = Q_NULLPTR);
    ~CWidget();
 
    void drawText(QPainter& thePainter);
    void drawText();
protected:
    void paintEvent(QPaintEvent *event)override;
    bool eventFilter(QObject *watched, QEvent *event);
 
protected slots:
    void slotTimerOut();
 
private:
    Ui::CWidgetClass ui;
 
    QPainter m_painter;
    QTimer* m_pTimer;
};

CWidget.cpp

#include "CWidget.h"
 
CWidget::CWidget(QWidget *parent)
    : QWidget(parent)
    , m_pTimer(nullptr)
{
    ui.setupUi(this);
 
    m_pTimer = new QTimer(this);
    m_pTimer->start(1000);
    ui.widget->installEventFilter(this);
    connect(m_pTimer, &QTimer::timeout, this, &CWidget::slotTimerOut);
}
 
CWidget::~CWidget()
{
    m_pTimer->stop();
    delete m_pTimer;
    
}
 
void CWidget::drawText(QPainter& thePainter)
{
    thePainter.setPen(QColor::fromRgb(253, 210, 8));
    QFont myFont = thePainter.font();
    myFont.setPointSize(10);
    myFont.setBold(true);
    QFontMetrics myFontMetrics(myFont);
    QRect myWinRect = rect();
    int width = myWinRect.width();
    int height = myWinRect.height();
 
    int myOffset = myFont.pointSize();
 
    thePainter.setFont(myFont);
    QRect myRect = myFontMetrics.boundingRect(u8"华夏民族");
/*    thePainter.drawText(myWinRect.width()*0.5f, myRect.height()*15, u8"H/TJW-504A型");*/
    thePainter.drawText(50, 50, u8"华夏民族");
 
}
 
void CWidget::drawText()
{
    QPainter thePainter(ui.widget);
    thePainter.setPen(QColor::fromRgb(253, 210, 8));
    QFont myFont = thePainter.font();
    myFont.setPointSize(10);
    myFont.setBold(true);
    QFontMetrics myFontMetrics(myFont);
    QRect myWinRect = rect();
    int width = myWinRect.width();
    int height = myWinRect.height();
 
    int myOffset = myFont.pointSize();
 
    thePainter.setFont(myFont);
    QRect myRect = myFontMetrics.boundingRect(u8"祖国统一");
    thePainter.drawText(myWinRect.width()*0.3f, myRect.height() + myOffset, u8"祖国统一");
    qDebug() << "222";
}
 
void CWidget::paintEvent(QPaintEvent *event)
{
    QPainter thePainter(this);
    drawText(thePainter);
    event->accept();
}
 
bool CWidget::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == ui.widget && event->type() == QEvent::Paint)
    {
        drawText();
        qDebug() << "33";
        return true;
    }
    return QWidget::eventFilter(watched, event);
}
 
void CWidget::slotTimerOut()
{
    update();
    int i = 0;
    qDebug() << u8"---" << i;
}

 

 

 

转 : https://blog.csdn.net/weixin_45151866/article/details/131977177

https://blog.csdn.net/xuancailinggan/article/details/50603141

 

posted @ 2023-10-09 14:01  与f  阅读(1261)  评论(0编辑  收藏  举报