2016-11-09 8 views
0

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 
+0

Etes-vous sûr que 'iconProvider.icon (fileInfo);' renvoie une icône valide? –

+0

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

+0

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. –

Répondre

0

Le problème a disparu sur une machine cible lors de la compilation dans les nouvelles versions de Qt, comme 5,6 et 5,7 dans les deux bedug ou libérer et en utilisant le même 32 ou 64 bits MS VS 2013 compilateur.