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 Laufzeit

    void 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?



    1. Welche Qt-Version verwendest du? Welchen Compiler/Plattform?
    2. 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();
    }
    

Anmelden zum Antworten