Bonjour à tous,

Utilisant le système WMI de windows, j'ai du implémenter ma propre fenêtre d'explorateur.
Pour cela j'ai associé un QListView et un QFileSystemModel ( a a coté de cela un QTreeView avec un autre QFileSystemModel qui ont le même soucis) . Cela marche globalement bien. J'ai juste un petit soucis, selon le dossier où je suis certaines icônes ne sont pas visibles.

Pour vous donner un exemple sur le Bureau ( et ces sous dossier) l'icone symbolisant les dossiers n’apparaît pas , de plus à certain moment (completement aléatoire) même celles des fichiers n’apparaîssent pas.
Pour autant pour vous donner un autre exemple dans le dossier "Mes documents" toute les icônes sont visibles.

Nom : Sans titre.png
Affichages : 161
Taille : 43,3 Ko Nom : Sans titre2.png
Affichages : 143
Taille : 44,2 Ko

De plus dès que ma souris bouge dans la QListView le texte suivant apparaît dans la sortie d'application :
onecore\com\combase\objact\objact.cxx(834)\combase.dll!00007FFB69BF80F3: (caller: 00007FFB69BF73B6) ReturnHr(1966) tid(47f8) 800401F0 CoInitialize n’a pas été appelé.
Voici comment est codé mon implémentation :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#ifndef DIALOGFILE_H
#define DIALOGFILE_H
 
#include <QDialog>
 
#include <QFileSystemModel>
 
namespace Ui {
class DialogFile;
}
 
enum modefileDialog{OPEN_MODE, OPEN_MULTIPLE_MODE, MODE, SAVE_MODE, SELECT_DIRECTORY};
 
class DialogFile : public QDialog
{
    Q_OBJECT
 
public:
    explicit DialogFile(QWidget *parent = nullptr);
    ~DialogFile();
 
    void setCaption(QString caption);
    void setNamesFilter(QStringList filter);
    void setNamesFilter(QStringList filterName, QStringList filter);
    void setCurrentDirectory(QString currentDirectory);
    void setMode(modefileDialog mode);
    void setDefaultExtention(QString ext){extention = ext;}
 
    QFileInfo getSelectedFile();
    QFileInfoList getSelectedFiles();
    QDir        getSelectedDirectory(){ return directory;}
 
 
private slots:
    void on_treeView_Lecteur_clicked(const QModelIndex &index);
 
    void on_listView_Fichier_clicked(const QModelIndex &index);
 
    void on_listView_Fichier_doubleClicked(const QModelIndex &index);
    void on_lineEdit_Filename_textChanged(const QString &arg1);
    void on_pushButton_Ok_clicked();
 
    void on_pushButton_Cancel_clicked();
 
 
    void on_comboBox_currentIndexChanged(int index);
 
protected :
    virtual void showEvent(QShowEvent * event);
    void ChangeCurrentFilter(int indice);
 
 
    virtual void changeEvent(QEvent *event);
 
 
 
private:
    Ui::DialogFile *ui;
    QFileSystemModel *dirModel;
    QFileSystemModel *fileModel;
 
    modefileDialog mode;
    QFileInfoList file;
    QDir directory;
    QString extention;
    QStringList filtres;
};
 
#endif // DIALOGFILE_H
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#include "dialogfile.h"
#include "dialogfile.h"
#include "ui_dialogfile.h"
 
#include <QtDebug>
#include <QKeyEvent>
#include <QInputDialog>
#include <QFileIconProvider>
#include <QStandardPaths>
#include <QModelIndexList>
 
 
 
DialogFile::DialogFile(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DialogFile)
{
    ui->setupUi(this);
    // Creates our new model and populate
#if _WIN32
     QString mPath = "C:/";
#elif __linux__
    QString mPath = "/";
#endif
    dirModel = new QFileSystemModel(this);
 
 
   // Set filter
   dirModel->setFilter(QDir::NoDotAndDotDot |
                       QDir::AllDirs);
 
   // QFileSystemModel requires root path
   dirModel->setRootPath(mPath);
 
   // Attach the model to the view
   ui->treeView_Lecteur->setModel(dirModel);
 
   for (int i = 1; i < dirModel->columnCount(); ++i)
       ui->treeView_Lecteur->hideColumn(i);
 
   // FILES
 
   fileModel = new QFileSystemModel(this);
 
   // Set filter
   fileModel->setFilter(QDir::NoDotAndDotDot |
                        QDir::Files | QDir::AllDirs);
 
   // QFileSystemModel requires root path
   fileModel->setRootPath(mPath);
 
   // Attach the file model to the view
    ui->listView_Fichier->setModel(fileModel);
    //ui->listView_Fichier->update();
}
 
DialogFile::~DialogFile()
{
    delete ui;
}
 
void DialogFile::setCaption(QString caption)
{
    this->setWindowTitle(caption);
 
}
 
void DialogFile::setNamesFilter(QStringList filter)
{
 
    setNamesFilter(filter,filter);
}
 
void DialogFile::setNamesFilter(QStringList filterName, QStringList filter)
{
 
    ui->comboBox->clear();
    ui->comboBox->addItems(filterName);
    ui->comboBox->setCurrentIndex(0);
    filtres = filter;
    ChangeCurrentFilter(0);
 
}
 
void DialogFile::setCurrentDirectory(QString currentDirectory)
{
    ui->listView_Fichier->setRootIndex(fileModel->setRootPath(currentDirectory));
    ui->treeView_Lecteur->expand(dirModel->index(currentDirectory));
    ui->lineEdit_Path->setText(currentDirectory);
 
}
 
void DialogFile::setMode(modefileDialog p_mode)
{
 
    mode = p_mode;
     bool multiple = false;
     if(mode == OPEN_MULTIPLE_MODE)
         multiple = true;
 
    if( mode == OPEN_MODE || mode == OPEN_MULTIPLE_MODE)
    {
        ui->pushButton_Ok->setText(tr("Ouvrir"));
    }
    else if ( mode == SAVE_MODE)
    {
        ui->pushButton_Ok->setText(tr("Sauvegarder"));
    }
    else if (mode == SELECT_DIRECTORY)
    {
        ui->pushButton_Ok->setText(tr("Selectionner"));
    }
 
    if ( multiple )
    {
        ui->listView_Fichier->setSelectionBehavior(QAbstractItemView::SelectRows);
        ui->listView_Fichier->setSelectionMode(QAbstractItemView::ExtendedSelection);
    }
    else
    {
        ui->listView_Fichier->setSelectionBehavior(QAbstractItemView::SelectItems);
        ui->listView_Fichier->setSelectionMode(QAbstractItemView::SingleSelection);
    }
 
}
 
QFileInfo DialogFile::getSelectedFile()
{
    if ( (file.size() == 0) && (mode == SAVE_MODE))
    {
        if (  ui->lineEdit_Filename->text()!= "")
        {
            file.push_back(fileModel->rootPath()+"\\"+ui->lineEdit_Filename->text());
        }
    }
    if ( ui->comboBox->currentIndex() < filtres.size() && file.size()!=0)
    {
        QStringList list = filtres[ui->comboBox->currentIndex()].split(" ");
        if ( !list.contains("*."+ file[0].suffix()))
            file[0].setFile(file[0].absoluteFilePath()+extention);
        return file[0];
    }
 
    return QFileInfo();
 
}
 
QFileInfoList DialogFile::getSelectedFiles()
{
    if ( ui->comboBox->currentIndex() < filtres.size() && file.size()!=0)
    {
        QStringList list = filtres[ui->comboBox->currentIndex()].split(" ");
 
        for (int i = 0; i< file.size();++i)
        {
            if ( !list.contains("*."+ file[i].suffix()))
                file[0].setFile(file[i].absoluteFilePath()+extention);
        }
    }
   return file;
}
 
 
void DialogFile::on_treeView_Lecteur_clicked(const QModelIndex &index)
{
    setCurrentDirectory(dirModel->fileInfo(index).absoluteFilePath());
}
 
void DialogFile::on_listView_Fichier_clicked(const QModelIndex &index)
{
    if (mode == SELECT_DIRECTORY)
    {
        if ( fileModel->isDir(index))
        {
            directory.setPath(fileModel->filePath(index));
            ui->lineEdit_Filename->setText(directory.dirName());
        }
 
    }
    else if ( mode == SAVE_MODE || mode == OPEN_MODE)
    {
        file.clear();
        if (!fileModel->isDir(index) )
        {
            file.push_back(fileModel->filePath(index));
            ui->lineEdit_Filename->setText( file.back().fileName() );
 
        }
    }
    else if ( mode == OPEN_MULTIPLE_MODE)
    {
        file.clear();
        QString filesname;
        QModelIndexList list = ui->listView_Fichier->selectionModel()->selectedRows();
        for ( int i  = 0; i < list.size(); ++i)
        {
            if (!fileModel->isDir(index))
            {
                file.push_back(fileModel->filePath(list[i]));
                filesname += "\"" + file.back().fileName() + "\" ";
            }
        }
        ui->lineEdit_Filename->setText(filesname);
    }
 
}
 
void DialogFile::on_listView_Fichier_doubleClicked(const QModelIndex &index)
{
    if (fileModel->isDir(index))
    {
        setCurrentDirectory(fileModel->fileInfo(index).absoluteFilePath());
    }
    else
    {
        file.clear();
        file.push_back(fileModel->filePath(index));
        done(QDialog::Accepted);
    }
}
 
 
 
 
 
 
 
void DialogFile::on_lineEdit_Filename_textChanged(const QString &arg1)
{
 
    if (arg1 == "")
        ui->pushButton_Ok->setEnabled(false);
    else if ( mode == OPEN_MODE && (file.size()==0))
        ui->pushButton_Ok->setEnabled(false);
    else if ( mode == OPEN_MODE && !QFile::exists(file[0].absoluteFilePath()))
        ui->pushButton_Ok->setEnabled(false);
    else
        ui->pushButton_Ok->setEnabled(true);
}
 
void DialogFile::showEvent(QShowEvent *event)
{
    ui->lineEdit_Filename->setText("");
}
 
void DialogFile::ChangeCurrentFilter(int indice)
{
    if ( indice < filtres.size())
    {
        QString FiltreaAppliquer = filtres[indice];
        QStringList lesFiltre =  FiltreaAppliquer.split(" ");
        fileModel->setNameFilters(lesFiltre);
        fileModel->setNameFilterDisables(false);
    }
}
 
 
 
 
 
void DialogFile::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange)
    {
       ui->retranslateUi(this);
    }
    QDialog::changeEvent(event);
}
 
//**************************** Validation *****************************
 
void DialogFile::on_pushButton_Ok_clicked()
{
        done(QDialog::Accepted);
}
 
void DialogFile::on_pushButton_Cancel_clicked()
{
    done( QDialog::Rejected);
}
 
 
 
void DialogFile::on_comboBox_currentIndexChanged(int index)
{
    ChangeCurrentFilter(index);
}
 
   0
Pour info je travail avec Qt5.5.1 et MSVC 2013 64bits

Merci d'avance pour votre aide.