C++ QPaint::begin在调试模式下使程序崩溃

C++ QPaint::begin在调试模式下使程序崩溃,c++,windows,debugging,qt5,qpainter,C++,Windows,Debugging,Qt5,Qpainter,1。问题描述 当程序正常运行时,调用工作正常,但在调试模式下执行时会导致程序崩溃。你知道为什么吗 2。环境 Windows 7 Pro 64位 Qt 5.9.2 MSVC 2017 Windows工具包\10\debugers\x64\cdb.exe 3。示例代码 主窗口 #包括 类主窗口:公共QMainWindow { Q_对象 公众: 显式主窗口(QWidget*parent=nullptr); }; MainWindow.cpp #包括“MainWindow.h” #包括“Pai

1。问题描述

当程序正常运行时,调用工作正常,但在调试模式下执行时会导致程序崩溃。你知道为什么吗


2。环境

  • Windows 7 Pro 64位
  • Qt 5.9.2
  • MSVC 2017
  • Windows工具包\10\debugers\x64\cdb.exe

3。示例代码

主窗口

#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=nullptr);
};
MainWindow.cpp

#包括“MainWindow.h”
#包括“Painter.h”
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父窗口)
{
auto*label=新的QLabel(此);
标签->设置像素贴图(Painter().paint());
setCentralWidget(标签);
}
画家

#包括
类别:公共QObject
{
Q_对象
公众:
显式绘制(QObject*parent=nullptr);
QPixmap paint();
};
Painter.cpp

#包括“Painter.h”
#包括
画家::画家(QObject*父):QObject(父)
{
}
QPixmap Painter::paint()
{
油漆工;
QPixmap-pixmap(16,16);
pixmap.fill(Qt::透明);

painter.begin(&pixmap);//从bugreports.qt.io/browse/QTBUG-64581重新发布

如果您通过QPainter::begin()开始绘制,您将期望在绘制完成之前通过QPaintDevice并且QPaintEngine处于活动状态。 绘制处于活动状态时,不应破坏QPaint引擎(未调用end()。 在示例中,QPixmap在QPainter完成绘制之前被销毁。
需要在调用end()之前或确保pixmap处于活动状态。

从bugreports.qt.io/browse/QTBUG-64581重新发布

如果您通过QPainter::begin()开始绘制,您将期望在绘制完成之前通过QPaintDevice并且QPaintEngine处于活动状态。 绘制处于活动状态时,不应破坏QPaint引擎(未调用end()。 在示例中,QPixmap在QPainter完成绘制之前被销毁。
需要调用end()之前或确保pixmap处于活动状态。

绘制函数中的Qpaint变量是否不需要以某种方式初始化?@bennji_of_the_overflow how,例如?我在Linux中使用Qt 5.9.2进行了尝试,效果很好,可能这是一个只在windows中发生的错误,我建议您报告它。@eyllanesc,我怀疑是调试器导致的这就是问题所在,因为除此之外,它在100%的时间内都可以正常工作。事实上,自从我将Qt升级到5.9.1和5.9.2版之后,我就遇到了调试问题。在某个时候,不仅是应用程序,而且Qt Creator在调试时崩溃。尽管我不知道是否可以用最小且可验证的示例。无论如何,我想在向Qt报告之前进行进一步调查。今天,我将在Win 10下进行相同的练习,看看会发生什么。当然,我将分享结果。@eyllanesc,我在Windows 10上确认此问题。我想我现在有足够的证据来报告它。绘制中的Qpaint变量是否不需要以某种方式初始化吗?@bennji_of_the_overflow如何,例如?我在Linux上用Qt 5.9.2试用过,效果很好,可能这是一个只在windows中出现的错误,我建议您报告它。@eyllanesc,我怀疑是调试器导致了问题,因为否则它在100%的时间内都可以正常工作。事实上,ever自从我将Qt升级到版本5.9.1和5.9.2之后,我在调试时遇到了问题。在某个时候,不仅应用程序,而且Qt Creator在调试时也崩溃。虽然我不知道是否可以用一个最小且可验证的示例来重现那个确切的版本。无论如何,我想在报告我的错误之前进行进一步的调查t到Qt。今天我将在Win 10下做同样的练习,看看会发生什么。当然,我将分享结果。@eyllanesc,我在Windows 10上确认了这个问题。我想我现在有足够的证据来报告它。
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
};
#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);
}
#include <QObject>

class Painter : public QObject
{
    Q_OBJECT
public:
    explicit Painter(QObject *parent = nullptr);

    QPixmap paint();
};
#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;
}