QPainter::begin 在调试模式下使程序崩溃
QPainter::begin crashes the program in debug mode
1.问题描述
调用QPainter::begin在程序正常运行时工作正常,但在调试模式下执行时导致崩溃。知道这是什么原因吗?
2。环境
- Windows 7 专业版 64 位
- Qt 5.9.2
- MSVC 2017
- Windows Kits\Debuggers\x64\cdb.exe
3。示例代码
MainWindow.h
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
};
MainWindow.cpp
#include "MainWindow.h"
#include "Painter.h"
#include <QLabel>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
auto *label = new QLabel(this);
label->setPixmap(Painter().paint());
setCentralWidget(label);
}
Painter.h
#include <QObject>
class Painter : public QObject
{
Q_OBJECT
public:
explicit Painter(QObject *parent = nullptr);
QPixmap paint();
};
Painter.cpp
#include "Painter.h"
#include <QPainter>
Painter::Painter(QObject *parent) : QObject(parent)
{
}
QPixmap Painter::paint()
{
QPainter painter;
QPixmap pixmap(16, 16);
pixmap.fill(Qt::transparent);
painter.begin(&pixmap); // <-- program crashes here on Debug
return pixmap;
}
4.调试器的输出
转发自 bugreports.qt.io/browse/QTBUG-64581
如果您通过 QPainter::begin() 开始绘画,您会期望在绘画完成之前通过 QPaintDevice 并且 QPaintEngine 处于活动状态。
当绘画处于活动状态时(未调用 end()),您不应该销毁 QPaintEngine。
在示例中,QPixmap 在 QPainter 完成绘制之前被销毁。
需要在之前调用 end() 或确保像素图处于活动状态。
1.问题描述
调用QPainter::begin在程序正常运行时工作正常,但在调试模式下执行时导致崩溃。知道这是什么原因吗?
2。环境
- Windows 7 专业版 64 位
- Qt 5.9.2
- MSVC 2017
- Windows Kits\Debuggers\x64\cdb.exe
3。示例代码
MainWindow.h
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
};
MainWindow.cpp
#include "MainWindow.h"
#include "Painter.h"
#include <QLabel>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
auto *label = new QLabel(this);
label->setPixmap(Painter().paint());
setCentralWidget(label);
}
Painter.h
#include <QObject>
class Painter : public QObject
{
Q_OBJECT
public:
explicit Painter(QObject *parent = nullptr);
QPixmap paint();
};
Painter.cpp
#include "Painter.h"
#include <QPainter>
Painter::Painter(QObject *parent) : QObject(parent)
{
}
QPixmap Painter::paint()
{
QPainter painter;
QPixmap pixmap(16, 16);
pixmap.fill(Qt::transparent);
painter.begin(&pixmap); // <-- program crashes here on Debug
return pixmap;
}
4.调试器的输出
转发自 bugreports.qt.io/browse/QTBUG-64581
如果您通过 QPainter::begin() 开始绘画,您会期望在绘画完成之前通过 QPaintDevice 并且 QPaintEngine 处于活动状态。 当绘画处于活动状态时(未调用 end()),您不应该销毁 QPaintEngine。 在示例中,QPixmap 在 QPainter 完成绘制之前被销毁。 需要在之前调用 end() 或确保像素图处于活动状态。