Qt:_QWidget::paintEngine:_Should_no_longer_be_called


目录

由来

注意下面我的创建过程:

下面是解决方法:

产生这个错误的原因:

由来

今天在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;
}

运行结果如下:

产生这个错误的原因:

在这里很好地解释了这一点:
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 将其显示在输出路径上。


文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录