J'écris une application avec TableView, un modèle personnalisé (QAbstractTableModel descendant) et des icônes dans les cellules. Tout d'abord, j'ai essayé de faire un cache d'icônes, mais tomber dans la violation d'accès (à l'adresse 0x0) tout en développant la fenêtre principale avec la table en plein écran.Icône dans Qt :: DecorationRole - provoque un plantage
Qt version est 5.5.1
de Windows 8.1
Sur un autre problème deux machines est pas reproductible. Le même fichier .exe peut provoquer un AV sur une machine cible et fonctionner correctement sur deux autres.
Qu'est-ce que je fais mal? Comment déboguer à la source d'un problème?
Alors j'ai essayé de reproduire le problème et fait une application la plus simple:
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();
}
Et ce code dans les résultats Violation d'accès lors de la tentative de développement de la fenêtre du programme en mode plein écran:
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)
La trace de la pile est:
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
Etes-vous sûr que 'iconProvider.icon (fileInfo);' renvoie une icône valide? –
J'ai ajouté la vérification 'icon.isNull()', mais rien n'a changé. L'icône est valide car dans cet exemple vous pouvez le voir - Jusqu'à ce que la fenêtre soit déroulée en plein écran. – Elmy
Y a-t-il d'autres problèmes avec les applications en plein écran sur cette machine? Si le problème n'est pas reproductible sur un autre PC, alors ce n'est pas un problème de votre code/qt. –