Qt::DecorationRole中的图标-导致崩溃

Icon in Qt::DecorationRole - causes a crash

本文关键字:崩溃 DecorationRole Qt 图标      更新时间:2023-10-16

我正在编写一个应用程序与TableView,自定义模型(QAbstractTableModel后代)和图标在单元格。首先,我试图使一个图标缓存,但落入访问违规(在地址0x0),而扩展主窗口与表全屏。

Qt版本为5.5.1

Windows 8.1

在另外两台机器上,

问题是不能重现的。同一个。exe文件可以在目标机器上导致AV,而在另外两台机器上运行正常。

我做错了什么?如何调试到问题的根源?

然后我试着重现这个问题,并做了一个最简单的应用程序:

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAbstractTableModel>
#include <QFileIconProvider>
namespace Ui {
class MainWindow;
}
class SimpleTableModel : public QAbstractTableModel
{
public:
    QFileIconProvider iconProvider;
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
};
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
    SimpleTableModel model;
};
#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "filetypeiconprovider.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton_clicked()
{
    ui->tableView->setModel(&model);
}
int SimpleTableModel::rowCount(const QModelIndex &parent) const
{
    return 100;
}
int SimpleTableModel::columnCount(const QModelIndex &parent) const
{
    return 5;
}
QVariant SimpleTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    switch(role){
        case Qt::DisplayRole:
            return QString("qwe");
            break;
        case Qt::BackgroundRole:
            if (index.row() % 2)
                return QBrush(QColor(0xfcf2fb));
            else
                return QBrush(0xfcfcf2);
            break;
        case Qt::DecorationRole:
            //if (index.column() == 0)
                {
                    QIcon icon;
                    QFileInfo fileInfo("e:\ss_source\youcam-tutorial.exe");
                    icon = iconProvider.icon(fileInfo);
                    return icon;
                }
            break;
        }
    return QVariant();
}

当试图将程序窗口扩展到全屏时,这段代码会导致访问冲突:

c:workbuildqt5_workdirwsqtbasesrcguipaintingqtransform.cpp:2047: ошибка: Exception at 0x5dd991fc, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)

堆栈跟踪为:

1   QTransform::type    qtransform.cpp  2047    0x5dd991fc  
2   QRasterPaintEngine::drawImage   qpaintengine_raster.cpp 2202    0x5dd1206b  
3   QRasterPaintEngine::drawPixmap  qpaintengine_raster.cpp 2052    0x5dd119bb  
4   QPainter::drawPixmap    qpainter.cpp    5196    0x5dd2dfe2  
5   QPainter::drawPixmap    qpainter.h  774 0x5da1ee2d  
6   QPixmapIconEngine::paint    qicon.cpp   178 0x5db21bfd  
7   QIcon::paint    qicon.cpp   902 0x5db20a7c  
8   QCommonStyle::drawControl   qcommonstyle.cpp    2186    0x5e46555b  
9   QWindowsStyle::drawControl  qwindowsstyle.cpp   1864    0x5e4f1648  
10  QWindowsXPStyle::drawControl    qwindowsxpstyle.cpp 2533    0x5e4da053  
11  QWindowsVistaStyle::drawControl qwindowsvistastyle.cpp  1470    0x5e4cb7e6  
12  QStyledItemDelegate::paint  qstyleditemdelegate.cpp 414 0x5e79028e  
13  QTableViewPrivate::drawCell qtableview.cpp  923 0x5e7224ec  
14  QTableView::paintEvent  qtableview.cpp  1480    0x5e71c983  
15  QWidget::event  qwidget.cpp 8831    0x5e41004c  
16  QFrame::event   qframe.cpp  540 0x5e5767e2  
17  QAbstractScrollArea::viewportEvent  qabstractscrollarea.cpp 1200    0x5e617ef3  
18  QAbstractItemView::viewportEvent    qabstractitemview.cpp   1686    0x5e6e73f2  
19  QAbstractScrollAreaPrivate::viewportEvent   qabstractscrollarea_p.h 102 0x5e3bc678  
20  QAbstractScrollAreaFilter::eventFilter  qabstractscrollarea_p.h 118 0x5e61b9d9  
21  QCoreApplicationPrivate::sendThroughObjectEventFilters  qcoreapplication.cpp    1072    0x642d8b03  
22  QApplicationPrivate::notify_helper  qapplication.cpp    3712    0x5e3c53f2  
23  QApplication::notify    qapplication.cpp    3681    0x5e3c3575  
24  QCoreApplication::notifyInternal    qcoreapplication.cpp    965 0x642d8247  
25  QCoreApplication::sendSpontaneousEvent  qcoreapplication.h  227 0x643f7b08  
26  QWidgetPrivate::sendPaintEvent  qwidget.cpp 5625    0x5e41713f  
27  QWidgetPrivate::drawWidget  qwidget.cpp 5569    0x5e416dea  
28  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5761    0x5e4174ca  
29  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
30  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
31  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
32  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
33  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
34  QWidgetPrivate::drawWidget  qwidget.cpp 5619    0x5e4170e7  
35  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5761    0x5e4174ca  
36  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
37  QWidgetPrivate::drawWidget  qwidget.cpp 5619    0x5e4170e7  
38  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5761    0x5e4174ca  
39  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
40  QWidgetPrivate::paintSiblingsRecursive  qwidget.cpp 5748    0x5e4173f5  
41  QWidgetPrivate::drawWidget  qwidget.cpp 5619    0x5e4170e7  
42  QWidgetBackingStore::doSync qwidgetbackingstore.cpp 1229    0x5e3d8359  
43  QWidgetBackingStore::sync   qwidgetbackingstore.cpp 1033    0x5e3d6500  
44  QWidgetPrivate::syncBackingStore    qwidget.cpp 1904    0x5e418e01  
45  QWidgetWindow::handleResizeEvent    qwidgetwindow.cpp   705 0x5e444686  
46  QWidgetWindow::event    qwidgetwindow.cpp   233 0x5e4434a4  
47  QApplicationPrivate::notify_helper  qapplication.cpp    3716    0x5e3c540e  
48  QApplication::notify    qapplication.cpp    3160    0x5e3c182e  
49  QCoreApplication::notifyInternal    qcoreapplication.cpp    965 0x642d8247  
50  QCoreApplication::sendSpontaneousEvent  qcoreapplication.h  227 0x643f7b08  
51  QGuiApplicationPrivate::processGeometryChangeEvent  qguiapplication.cpp 2067    0x5da648f7  
52  QGuiApplicationPrivate::processWindowSystemEvent    qguiapplication.cpp 1593    0x5da64fbd  
53  QWindowSystemInterface::sendWindowSystemEvents  qwindowsysteminterface.cpp  625 0x5da399d1  
54  QWindowsGuiEventDispatcher::sendPostedEvents    qwindowsguieventdispatcher.cpp  84  0x63cc4d4d  
55  qt_internal_proc    qeventdispatcher_win.cpp    416 0x64368a1b  
56  _InternalCallWinProc    USER32      0x76458e71  
57  UserCallWinProcCheckWow USER32      0x764590d1  
58  DispatchMessageWorker   USER32      0x7645a66f  
59  DispatchMessageW    USER32      0x7645a6e0  
60  QEventDispatcherWin32::processEvents    qeventdispatcher_win.cpp    818 0x6436946d  
61  QWindowsGuiEventDispatcher::processEvents   qwindowsguieventdispatcher.cpp  74  0x63cc4c65  
62  QEventLoop::processEvents   qeventloop.cpp  129 0x642d3fac  
63  QEventLoop::exec    qeventloop.cpp  204 0x642d41b2  
64  QCoreApplication::exec  qcoreapplication.cpp    1229    0x642d6872  
65  QGuiApplication::exec   qguiapplication.cpp 1528    0x5da61848  
66  QApplication::exec  qapplication.cpp    2977    0x5e3c1489  
67  main    main.cpp    10  0x138435f   
68  WinMain qtmain_win.cpp  113 0x13a30ed   
69  __tmainCRTStartup   crtexe.c    618 0x13a24cf   
70  WinMainCRTStartup   crtexe.c    466 0x13a228d   
71  BaseThreadInitThunk KERNEL32        0x74c97c04  
72  __RtlUserThreadStart    ntdll       0x773ead1f  
73  _RtlUserThreadStart ntdll       0x773eacea  

当在较新的Qt版本中编译时,问题在目标机器上消失,如5.6和5.7在bedug或release中,并使用相同的32或64位MS VS 2013编译器。