当前位置: 首页 > news >正文

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

目录

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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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_OBJECTpublic: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函

    数调用的函数内。

http://www.dtcms.com/a/557679.html

相关文章:

  • 成都的网站建设为什么建设银行网站打不开
  • 山东济南网站建设公司排名建站技术
  • PHP-5.2.1.tar.gz 离线安装教程:从源码编译到配置的详细步骤(附安装包)
  • Postman持久化保存/设置断言详解
  • 有害内容检测系统复现指南
  • dw软件怎么制作网页百度seo网站优化怎么做
  • 软件测试之环境搭建及测试流程
  • [N_084]基于jsp,ssm学生信息管理系统
  • AI基础概念-第一部分:核心名词与定义(一)
  • 做设计用到的网站wordpress默认播放器
  • WordPress如何建立手机网站网络营销的发展趋势和前景
  • AXF文件变量地址查找完全指南
  • 网站设计是什么自备服务器做网站
  • 物联网运维中基于自适应射频环境监测的动态频谱优化技术
  • Linux PCIe子系统深度解析:从硬件原理到驱动开发
  • ASP Folder:深入解析其功能与使用技巧
  • 那种网站建设软件最好广州网站制作联系方式
  • 做的丑的网站有哪些知乎女生做a视频的网站是什多少
  • linux命令-磁盘管理-6
  • rdpwsx!TSrvInitWD函数分析到rdpwd!WDWConfConnect
  • 购买一级域名做网站青岛seo关键词排名
  • 如何建网站保定自己做公司网站简单吗
  • 怎样理解网站建设与开发这门课红杉树装饰公司口碑怎么样
  • 用 Trae AI 编程打造我的个人成长空间:旅行、相册、我的信息模块全上线!
  • 临海 网站建设友情链接是什么意思
  • 意大利语网站建设软件工程学科评估
  • AutoCAD 2025软件安装包下载及安装教程
  • arcpy_pytho2.7_arcmap10.2乱码问题
  • MATLAB水滴下落湖水面泛起涟漪仿真
  • 【Python】For Midterm Review2(week1-6)