QWidget::paintEngine: Should no longer be called错误情况总结

qt在子控件widget上绘图报错:QWidget::paintEngine: Should no longer be called... 解决 以下代码绘制视频展示在整个窗口上PageOne,我想展示到 子控件widget 上,QPainter painter(ui->widget_5); 直接这样修改报错: #include "pageone.h" #include "ui_pageone.h" #include "QDebug" #include <QPainter> PageOne::PageOne(QWidget *parent) : QWidget(parent) , ui(new Ui::P. 阅读详情

目录

1. Qt绘图报错描述

2. 错误原因及解决方法

2.1.第1种情况

2.2. 第2种情况

3. 总结


1. Qt绘图报错描述

        当用QPainter绘图时,如果使用不当,Qt会报如下错误提示:

2. 错误原因及解决方法

2.1.第1种情况

        绘图代码不在QWidget::paintEvent重载函数内或不在被QWidget::paintEvent函数调用的函数内。Qt规定:任何窗体内的绘图必须放在QWidget::paintEvent重载函数内或被QWidget::paintEvent函数调用的函数内。如下代码:

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_pImage = new QImage("b.png");
    auto b = m_pImage->isNull();
    Q_ASSERT(!b);

    QPainter p(this);
   p.drawImage(rect(), *m_pImage, m_pImage->rect());
}

原意是想把成员变量m_pImage表示的图像在Widget类的构造函数中绘制到Widget窗体类的矩形内,但报1节描述的错误。正确的做法是应把绘图代码移动到paintEvent重载函数内,即如下那样:

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_pImage = new QImage("b.png");
    auto b = m_pImage->isNull();
    Q_ASSERT(!b); 
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawImage(rect(), *m_pImage, m_pImage->rect());
}

Widget.h文件如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:

    virtual void paintEvent(QPaintEvent *event) override;
private:
    Ui::Widget *ui;
    QImage* m_pImage;
};
#endif // WIDGET_H

2.2. 第2种情况

        图像绘制到窗体中的小部件上,如:绘制图像到Widget窗体中的某个QLabel上,像如下代码那样:

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_pImage = new QImage("b.png");
    auto b = m_pImage->isNull();
    Q_ASSERT(!b);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(ui->label);
    p.drawImage(ui->label->rect(), *m_pImage, m_pImage->rect());
}

其中ui->label为Widget窗体上的一个QLabel,同样报1节的错误。Qt规定:任何窗体子部件的绘图必须放在该子部件的paintEvent重载函数内或在被子部件的paintEvent函数调用的函数内。解决方法如下:

1):自定义子部件类。

2):在自定义部件类的paintEvent重载函数内绘图。

如下代码就是自定义了一个名为CMyLabel的类,在该类的paintEvent重载函数内绘图成功:

#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>

class CMyLabel : public QLabel
{
    Q_OBJECT

public:
    explicit CMyLabel(QWidget *parent = nullptr);
    ~CMyLabel();


private:

    virtual void paintEvent(QPaintEvent *event) override;

private:

     QImage* m_pImage;
};

#endif // MYLABEL_H
#include "myLabel.h"
#include "ui_myLabel.h"
#include<QPainter>
#include<QPaintEvent>
CMyLabel::CMyLabel(QWidget *parent) :
    QLabel(parent)
{
    m_pImage = new QImage("d:/b.png");
    auto b = m_pImage->isNull();
    Q_ASSERT(!b);
}

CMyLabel::~CMyLabel()
{

}
void CMyLabel::paintEvent(QPaintEvent *event)
{
   QPainter p(this);
   p.drawImage(rect(), *m_pImage, m_pImage->rect());
}

3. 总结

为了保证Qt绘图时不报错,能成功,必须遵循如下规定:

1):任何窗体内的绘图必须放在QWidget::paintEvent重载函数内或被QWidget::paintEvent函数调用

    的函数内。

2):任何窗体子部件的绘图必须放在该子部件的paintEvent重载函数内或在被子部件的paintEvent函

    数调用的函数内。

Qt学习笔记(三十):Qt 中的绘图 一、QPainter:绘图对象 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于 QPainter,QPainterDevice 和 QPaintEngine 三个类。 QPainter 用来执行绘制的操作(相当于画家); QPaintDevice 是一个绘图设备,允许 QPainter 在其上面进行绘制,也就是 QPainter 工作的空间(相当于画... 阅读详情

相关推荐

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3172

Qt: QWidget::paintEngine: Should no longer be called

QT错误

weixin_57165154的博客 8004

数据预处理的分箱操作

数据分箱 介绍 我们在建立模型前,一般需要对特征变量进行离散化,特征离散化后,模型会更稳定,降低模型过拟合的风险。尤其是采用 logsitic 建立评分卡模型时,必须对连续变量进行离散化。而特征离散化处理通常采用的就是分箱法,数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,提高泛化性。 数据分箱又分为有监督分箱和无监督分箱,是否使用标签进行离散化(分箱)决定了有监督还是无监督的离散化方法。 知识点 无监督分箱 split 分箱 merge 分箱 无监督分箱 这里为了

随笔记 5332

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

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

weixin_45151866的博客 3468

基于继电器与三极管的自动水泵控制器DIY:从电路原理到PCB制作实战

继电器作为一种利用电磁原理实现电路通断控制的电气开关,其核心价值在于通过小电流信号控制大电流负载,实现强弱电之间的安全隔离。在自动化控制领域,继电器常与三极管等半导体器件配合,构成驱动电路,将微弱的传感器信号放大,从而可靠地控制电机、水泵等执行机构。这种组合技术广泛应用于工业控制、智能家居及各类电子DIY项目中,例如实现水箱水位的自动检测与控制。本文将以一个典型的自动水泵控制器项目为例,深入剖析如何利用继电器与三极管搭建水位检测与驱动电路,并详细讲解从电路设计、PCB自制(热转印法)到系统调试的完整工程实践

weixin_31774841的博客 346

HDMI 2.1超高清传输背后的“隐形功臣”:深入浅出图解VESA DSC压缩核心流程

本文深入解析HDMI 2.1超高清传输中的VESA DSC压缩技术,揭示其如何在不损失画质的前提下实现带宽减半。通过切片并行处理和智能算法,DSC技术有效解决了8K/4K高帧率视频的传输瓶颈,成为现代显示设备不可或缺的“隐形功臣”。

weixin_30615767的博客 423

自学QT之QWidget::paintEngine: Should no longer be called的解决办法

这个还是以前遇到的,今天突然想起来,就决定重现一下当初的错误,以及错误的代码。 报错是这个样子的: QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1 其实这个原因很简单,来看看报错的代码: #include "mainwi

CN小黑 3万+

工业级Modbus ASCII实时监控系统(WinForms完整实现)

本文介绍了一个基于WinForms的工业级Modbus ASCII实时监控系统实现方案。该系统采用经典工控界面布局,包含串口配置、数据采集控制和实时数据显示三大区域。核心功能包括:串口通信参数设置、Modbus从站地址配置、寄存器数据采集、实时数据表格展示和趋势图绘制。系统通过ModbusAsciiClient类实现通信核心,采用定时器轮询机制采集数据,支持最多100个数据点的历史趋势显示。界面设计注重用户体验,配置区位于左侧,主显示区在右侧,底部为状态和日志区,符合工业控制系统的操作习惯。代码示例展示了窗

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 277

MeloTTS 生成 RKNN 模型

摘要: 本方案基于RK3588平台,利用RKNN工具链实现高效语音合成(TTS)。采用MeloTTS开源模型,支持中英文混合语音生成。部署流程包括:1) 导出ONNX模型;2) 转换为RKNN格式;3) 在RK3588开发板运行。关键步骤包含环境配置(RKNN Toolkit2≥1.4.0)、模型转换(非量化处理)及音频处理实现。方案充分发挥RK3588的NPU加速能力,适用于边缘设备语音合成场景

J。 346

硬件工程师笔记——电子器件汇总大全

本文系统总结了14种常用电子器件的工作原理及功能应用,包括电阻、压敏电阻、电容、电感、二极管、三极管、MOS管、晶振、光耦、IGBT、继电器、磁珠、可控硅和线性稳压器。每种器件从结构原理、工作特性到典型应用进行全面解析,如电阻的限流分压、电容的储能滤波、三极管的放大开关等。重点阐述了各器件在电路设计中的关键作用,如IGBT的功率控制、继电器的隔离保护、LDO的电压稳定等,并提供了实际电路应用案例。文章还整理了硬件工程师笔试面试相关的知识点和真题资源,为电子工程师提供全面的技术参考。

XU157303764的博客 2万+

QT中绘图事件出现QWidget::paintEngine: Should no longer be called 错误

QT中添加绘图时出现这种错误,有可能是命名错误; QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1 正常情况下protected里面的函数是不会被调用的 但是 void paintEvent(QPaintEvent*...

双鱼座boyy的博客 4655

基于Python的电商平台商品信息爬取与价格监控系统设计与实现

本文详细介绍了一个基于Python的电商平台商品信息爬取与价格监控系统的设计与实现。系统采用最新的Python爬虫技术栈,包括Scrapy框架、Selenium自动化测试工具、BeautifulSoup解析库等,实现了对主流电商平台商品信息的自动化采集、存储、分析和可视化展示。文章从系统架构设计、关键技术实现、核心代码解析等方面进行了全面阐述,并提供了完整的代码实现。该系统不仅适用于毕业设计,也可作为商业价格监控系统的原型。关键词:Python爬虫;电商数据采集;价格监控;Scrapy;Selenium;

2201_76125261的博客 963

Qt QWidget::paintEngine: Should no longer be called 错误的解决办法

今天在重写QListView的 paintEvent方法时  QPainterpainter(this); painter.drawText(rect(),Qt::AlignCenter,tr("Draganddropfile(s)here")); 运行时遇到了如下问题(并且文字并没有显示): QWidget::paintEngine: Should no longer

一个人,在路上 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0

继承QAbstractScroll后,重新实现paintEvent函数时,报错: QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1 QPainter::setFont: Painter not active QPainter::setPen: Painter not active QPainter::translate: Painter no

weixin_44191756的博客 1895

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

解决Qt6 C++ Qpainter 画图时 Painter not active QWidget::paintEngine: Should no longer be calledQPaint的问题

画图出现问题如下: QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1 QPainter::setPen: Painter not active QPainter::setPen: Painter not active QPainter::end: Painter not active, aborted QWidget::paintEn

SmartGridequation的博客 7264

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

QWidget::paintEngine: Should no longer be called 错误解决办法

再做项目时,再QPlainTextEdit中画个边框,然后用到paintEvent,结果报错 开始写成:QPainter painter(this); 报错 改成这样:QPainter painter(this->viewport()); 不报错,而且还能画出来 ...

Pailugou的博客 7730

QPainter的使用过程中遇到的一些问题,QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device

要在哪个窗体里面绘图就要重写它的paintevent(),然后把绘图操作的代码放到paintevent函数里面。2.在paintevent里面去使用画笔但是,但是指定的绘图对象不是this…1.没有在paintevent里面去使用画笔。

wow_awsl_qwq的博客 1607

Qt绘图时,提示错误QWidget::paintEngine: Should no longer be called

在Qt进行的绘图过程中,提示如下内容,原因是Qt中的绘图只能在paintEvent()中进行 如果在其它函数进行绘图,则会提示如下错误

Wanggj的博客 6866

Unable to paint on Qt Widget, shows error “paintEngine: Should no longer be called”

今天在使用QPainter的时候QPainter不起作用,同时出现了如下错误: QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1 QPainter::setPen: Painter not active QPainter

修锅换壶底 6350

QWidget::paintEngine: Should no longer be calledQPainter::begin: Paint device returned engine == 0,

这样就不报错误了,也不是网上所说的必须要在void MainWindow::paintEvent(QPaintEvent *e)这个函数里才能绘图。

Sunsh1ne_Su的博客 688

QT在QPlainTextEdit和QTextEdit中paintEvent无法绘制

paintEvent无法绘制 使用QPlainTextEdit和QTextEdit重载paintEvent重新绘制时,出现了一下的报错 QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1 通过Google和百度,发现一堆都是别人抄的,通过观看别人开源的代码和官方的文档,试验后发现在paintEvent中只需要 //添加这句话 QPa

weixin_43352959的博客 981

qt QPainter计算字符串大小

QWidget类初始化时创建QPainter类是提示下面错误,意思当前绘制引擎未创建,无法使用的 QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1

zp33 481

qt程序运行时绘图出现错误

问题 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 程序运行的时候出现上述问题,说明此时下端代码并未被触发。 void Form::paintBorder(QWidget *w

肩上风骋的博客 1604

Qt 解决继承 QChartView 重写 paintEvent 函数 bug

一、概述 1.1 错误信息 继承 QChartView 重写 paintEvent 函数时出现以下错误信息。 QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1 QPainter::setRenderHint: Painter must be active to set rendering hints QPainter::translate:

Show me the code. 1396
上一篇: QTableWidget表头列名过长换行问题解决
下一篇: QTableWidget、QTableView设置行高、列宽不起效果的解决办法
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值