目录
由来
今天在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 将其显示在输出路径上。