QDirModel/QTreeView Problem
-
Hi,
ich knabbere zZ an einem Problem mit QTreeView und QDirModel. Ich suche eine Möglichkeit
das Model _nach_ QTreeView->setModel() zu verändern: konkret möchte ich zur Laufzeitvoid QDirModel::setNameFilters ( const QStringList & filters )
mit verschiedenen QStringLists (eingegeben vom Nutzer) aufrufen. Tue ich dieses, wird jedoch
das Model geändert und mein Programm crashed beim Suchen vom FileAttributes eines Listenelements
auf das ich klicke (soviel per Debugger rausgefunden).Ich könnte jedesmal das aktuelle Modell kopieren, darauf setNameFilters(.) aufrufen und dann
dem View neu zuweisen. Overkill? Ist das der "richtige" Weg? Gibts nen besseren Weg?
Muss ich das alte QDirModel() selber löschen?Vorgehen:
// irgendwo früher: // globalFileFilter = QStringList() << "*.cpp" << "*.h" << "*.c"; // rootDir = new QLineEdit(QDir::home()); //snipp treeView = new QTreeView(); directoryModel = new QDirModel(globalFileFilter, QDir::AllDirs|QDir::AllEntries|QDir::NoDotAndDotDot, QDir::Name|QDir::Type|QDir::DirsFirst, 0); treeView->setModel(directoryModel); // snipp some more treeView->settings // adjust tree view width on expand/collapse connect(treeView,SIGNAL(expanded(QModelIndex)),this,SLOT(updateTreeView())); connect(treeView,SIGNAL(collapsed(QModelIndex)),this,SLOT(updateTreeView())); // handle tree view selection connect(treeView,SIGNAL(clicked(QModelIndex)),this,SLOT(treeViewClicked())); updateTreeView(); // snipp
void test::updateTreeView() { qDebug("updateTreeView()"); // Nachfolgende Anweisung läßt prog crashen. Vermute mal das Model wird dadurch invalide? // directoryModel->setNameFilters(globalFileFilter); treeView->setRootIndex(directoryModel->index(rootDir->text())); treeView->resizeColumnToContents(0); } void test::treeViewClicked() { qDebug("treeViewClicked()"); }
-
selbst ist der Mann
QSortFilterProxyModel ist mein Freund ... zum Teil...
treeView = new QTreeView(); // model holding the data directoryModel = new QDirModel(QStringList(), QDir::AllDirs| QDir::AllEntries| QDir::NoDotAndDotDot, QDir::Name|QDir::Type|QDir::DirsFirst,0); // proxy model for data filtering // just pass through here proxyModel = new QSortFilterProxyModel(); proxyModel->setSourceModel(directoryModel); proxyModel->setDynamicSortFilter(true); // view on the filtered data treeView->setModel(proxyModel); treeView->setAlternatingRowColors(true); treeView->setUniformRowHeights (true); treeView->setAnimated(false); treeView->setSelectionMode(QAbstractItemView::SingleSelection); treeView->setSelectionBehavior(QAbstractItemView::SelectRows); // adjust tree view width on expand/collapse connect(treeView,SIGNAL(expanded(QModelIndex)),this,SLOT(updateTreeView())); connect(treeView,SIGNAL(collapsed(QModelIndex)),this,SLOT(updateTreeView())); // handle tree view selection connect(treeView,SIGNAL(clicked(QModelIndex)),this,SLOT(treeViewClicked()));
Nur leider wird - sobald ich
proxyModel->setFilterRegExp(QRegExp(QString("*.*"), Qt::CaseInsensitive, QRegExp::Wildcard)); proxyModel->setFilterKeyColumn(0);
setze kein einziges Item mehr angeführt.
Ideen?
-
- Welche Qt-Version verwendest du? Welchen Compiler/Plattform?
- Warum verwendest du QDirModel?
Note: The usage of QDirModel is not recommended anymore. The QFileSystemModel class is a more performant alternative.
Ich hab das hier trotzdem mit beidem - QDirModel und QFileSystemModel - probiert, und bei mir crasht nix ...
Qt-4.6.2, gcc-4.4.3
-
Qt 4.5.1
crashed tut bei mir auch nichts, nur schein das proxyModel nur den erste Column zu prüfen -
gebe ich nun *.cpp als Filter an, (QDir startet bei /) dann ist das != und alle childNodes
werden ignoriert ==> leere View.Danke für den Hinweis auf QFileSystemmodel, ich kam von QDir -> QDirModel und kannte den a
anderen nicht. Das mit dem Threaded fill klingt interessant.Minibeispiel:
#include <QtGui> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget * w = new QWidget; QVBoxLayout * lay = new QVBoxLayout; QDirModel * model = new QDirModel; QSortFilterProxyModel * proxy = new QSortFilterProxyModel(); QTreeView * tree = new QTreeView; //proxy->setFilterRegExp(QString("*.cpp")); // das hier einkommentieren proxy->setSourceModel(model); tree->setModel(proxy); tree->setWindowTitle(QObject::tr("Dir View")); tree->resize(640, 480); lay->addWidget(tree); w->setLayout(lay); w->show(); return app.exec(); }