QPainter :: begin在调试模式下崩溃程序

时间:2017-11-16 21:27:40

标签: c++ windows debugging qt5 qpainter

1。问题描述

当程序正常运行时调用this可以正常工作,但在 Debug 模式下执行时会导致它崩溃。任何想法是什么原因?

2。环境

  • Windows 7 Pro 64位
  • Qt 5.9.2
  • MSVC 2017
  • Windows Kits \ 10 \ Debuggers \ x64 \ cdb.exe

第3。示例代码

MainWindow.h

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

MainWindow.cpp

#include <QObject>

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

    QPixmap paint();
};

Painter.h

#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;
}

Painter.cpp

<div class="dropdown">
    <button id="dropdown-wifi" class="extended-button" onclick="showDropDown()">Available WiFi Hot Spots</button>
    <div id="ssid-dropdown" class="dropdown-content">
        <!-- drop-down menu items dynamically created by JavaScript -->
    </div>
</div>

4。调试器的输出

QPainter::begin enter image description here

1 个答案:

答案 0 :(得分:2)

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

如果您开始使用QPainter :: begin()进行绘画,那么在绘画完成之前,您可能会通过QPaintDevice并且QPaintEngine处于活动状态。 绘画处于活动状态时不应销毁QPaintEngine(不调用end())。 在示例中,QPixmap在QPainter完成绘制之前被销毁。 需要先调用end()或确保pixmap存活。

相关问题