Иконка в Qt :: DecorationRole — вызывает сбой

Я пишу приложение с 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:\work\build\qt5_workdir\w\s\qtbase\src\gui\painting\qtransform.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

0

Решение

Проблема исчезла на целевой машине при компиляции в более новых версиях Qt, таких как 5.6 и 5.7 как в bedug, так и в выпуске с использованием того же 32 или 64-битного компилятора MS VS 2013.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]