目录

由来

注意下面我的创建过程:

下面是解决方法:

产生这个错误的原因:


由来

今天在QT Creater使用QPainter的时候出现了这个错误,在引用输出窗口还有这么一些错误

之前在使用其他类的时候,直接在widget.h中的MainWindow中写都可以运行像这样

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QStatusBar>
#include <QMessageBox>
#include <QColorDialog>
#include <QDebug>
#include <QFileDialog>
#include <QString>
#include <QFontDialog>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);QStatusBar *staBar = statusBar();setStatusBar(staBar);//only one set, not only one add;ui->actionNew->setIcon(QIcon("D:/图片/三体智子高清4k动漫壁纸_彼岸图网.jpg"));connect(ui->actionNew, &QAction::triggered, [=](){
//        mo tai duihuakuang
//        QDialog log(this);//模态QDialog *log = new QDialog(this);//new在堆区的log->resize(200, 100);log->show();//非模态log->setAttribute(Qt::WA_DeleteOnClose);//非模态的时候才需要设置这个属性,因为非模态是new在堆区的
//        log.exec();//模态,把窗口阻塞了
//        fei motai dui hua kuang});
//    QMessageBox::critical(this, "ha", "错误");
//    QColorDialog color = QColorDialog::getColor(QColor(255, 0, 0));
//    qDebug()<<"r="<<color.red()<<" "<<"g="<<color.green();
//    QString str = QFileDialog::getOpenFileName(this, "open",
//                                 "D:\OneDrive文档\OneDrive - officeapp.org\Desktop", "*.txt");
//    qDebug()<<str;
//    bool flag;
//    QFont font = QFontDialog::getFont(&flag, QFont("华文彩文", 36));
}MainWindow::~MainWindow()
{delete ui;
}

注意下面我的创建过程:

 

 注意这一步

然后我在QWidget.cpp中写了下面的代码

#include "ui_widget.h"
#include <ui_widget.h>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);QPainterPath path;path.addRect(20, 20, 60, 60);//    path.moveTo(0, 0);
//    path.cubicTo(99, 0,  50, 50,  99, 99);
//    path.cubicTo(0, 99,  50, 50,  0, 0);QPainter painter(this);painter.fillRect(0, 0, 100, 100, Qt::white);painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine,Qt::FlatCap, Qt::MiterJoin));painter.setBrush(QColor(122, 163, 39));painter.drawPath(path);
}Widget::~Widget()
{delete ui;
}

然后就出现了上面的错误。

下面是解决方法:

首先在QWidget.h中加入这个函数的申明

void paintEvent(QPaintEvent *);

然后再QWidget.cpp中定义这个函数,此时就可以使用QPainter类了

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);}
void Widget::paintEvent(QPaintEvent *){QPainterPath path;path.addRect(20, 20, 60, 60);path.moveTo(0, 0);path.cubicTo(99, 0,  50, 50,  99, 99);path.cubicTo(0, 99,  50, 50,  0, 0);QPainter painter(this);painter.fillRect(0, 0, 100, 100, Qt::white);painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine,Qt::FlatCap, Qt::MiterJoin));painter.setBrush(QColor(122, 163, 39));painter.drawPath(path);
}Widget::~Widget()
{delete ui;
}

运行结果如下: 

 产生这个错误的原因:

在这里很好地解释了这一点:

Unable to paint on Qt Widget, shows error “paintEngine: Should no longer be called” | Qt Forum@Chris-Kawa Thanks for the suggestion, i am inspired from the qt example scribble in doing my program, in that example the painter is created and used in drawLineTo and updated. Do you know how that works? I also tried to modify my program accordingly as...https://forum.qt.io/topic/64693/unable-to-paint-on-qt-widget-shows-error-paintengine-should-no-longer-be-called/3

简而言之:不要尝试直接从输入事件处理程序进行绘制,而是在您的小部件中重载 paintEvent 方法并在那里创建 QPainter。仅使用输入事件来修改内部数据模型,并在paintEvent 中使用QPainter 将其显示在输出路径上。

Qt: QWidget::paintEngine: Should no longer be called相关推荐

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

    报错信息 QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine ...

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

    今天在使用QPainter的时候QPainter不起作用,同时出现了如下错误: QWidget::paintEngine: Should no longer be called QPainter::b ...

  3. Qt QWidget实现消息提示控件TipsWidget

    前言 用Qt实现一个消息提示控件,控件宽度会根据显示的内容多少来动态伸展,控件显示三秒钟过后会自动渐变透明度然后最终消失,这有点类似于Android的Toast控件,都是用于消息短暂提示. 源码 头文 ...

  4. Qt QWidget实现开关控件SwithButton(SlipButton)

    前言 Qt做界面的时候常常会用到开关控件,类似于CheckButton有两种状态,只是界面表现形式不一样而已.本文通过QWidget类来实现一个开关控件SwitchBtn(有些平台上又称为SlipBu ...

  5. Qt QWidget实现手势缩放和平移(二)

    上一篇文章中讲到了QWidget实现手势缩放和平移,通过QGestureEvent来捕捉手势操作,但是这种方式不一定能通用,比如像教学用的电子白板上,是红外触控感应,并不能通过QGestureEven ...

  6. Qt QWidget实现手势缩放和平移(一)

    由于项目要求,需要在QWidget中实现一个手势操作的功能,对图片进行放大/缩小/平移功能,并且还需要支持通过鼠标和键盘来实现该功能.其实这种功能在QGraphicsView中实现比较简单, 不过在Q ...

  7. Qt QWidget播放视频背景图片闪烁

    播放软件主窗口重新实现函数changeEvent,解决最小化之后界面不刷新问题. void VRS::changeEvent(QEvent * event) {//最小化之后再恢复到之前状态,界面会出 ...

  8. [Qt] QWidget QWindow 窗口管理器(WM)

    Widget 和 窗口 Qt中,没有Parent 的 Wiget(QWidget 及其子类) 会自动成为一个窗口,如果一个QButton 没有parent,同样会成为一个窗口: 窗口是由操作系统统一管 ...

  9. Qt qwidget嵌入ppt

    1. pro :  增加  QT+=axcontainer 2.打开ppt QAxObject *ppt_dsoframer;ppt_dsoframer=new QAxObject(this);boo ...

最新文章

  1. 你知道Java的四种引用类型吗?
  2. Redhat7 systemctl命令
  3. vuls漏洞扫描工具
  4. 工具栏,状态栏(VC_MFC)
  5. window系统无限试用 JAVA IDEA不限版本
  6. ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
  7. 【三层】无法直接启动带有“类库输出类型”的项目
  8. Class类文件结构之ConstantValue属性
  9. 学做‘视频剪辑’攻略
  10. LVDS,接口,时序讲解
  11. 地磁计HMC5883L
  12. 微量样本RNA甲基化m6A技术比较
  13. “不学数学就去当厨子”,兰大校友入选全球竞赛最强10人,决赛最后几小时才想起做题...
  14. 文献学习(part31)--Discovery of time-inconsecutive co-movement patterns of foreign currencies using ...
  15. SpringBoot整合lombok日志
  16. 单片机原理及应用 实验六 双机通信与PCB设计
  17. ArrayList练习,随机数导入集合list内,方法实现偶奇数筛选
  18. 警惕,老外也诈骗!!
  19. android是硬件还是软件,浅谈Android软硬件巧妙整合的开发技巧
  20. 笔试逻辑智力题数列找规律小结

热门文章

  1. 我国工业自动化市场现状分析报告
  2. linux查看电脑耗电量,命令行 - 在Linux上,观察程序耗电量使用的最佳方法是什么?...
  3. 解决安装出现用户在命令上发出enlas_agreed=1的问题
  4. javascript如何对location.hash过滤xss跨站脚本
  5. 269 t101 对称二叉树
  6. 2018 51信用卡春招后端开发实习题解
  7. TTL、CMOS、LVTTL、LVCMOS、LVDS
  8. 量化交易-回测调参-神龙摆尾
  9. 区块链共识算法(4)分布式一致性算法Paxos
  10. 学习笔记 之 计算机网络:自顶向下方法(原书第7版)