Как выбрать строку в QTreeview программно?


Update: позвольте мне попытаться упростить проблему и шаги. Кто-нибудь видит, в чем я ошибся? Кроме того, это на OSX 10.7.5/Qt 5.1-возможно, это проблема OSX?

Я передаю абсолютный путь, который указывает на каталог изображений, и устанавливаю корневой путь моего экземпляра QFileSystemModel и использую индекс, возвращаемый этим, чтобы установить корневой индекс моего экземпляра QTreeView

QModelIndex idx = dirmodel->setRootPath(dPath);
myTreeView->setRootIndex(idx);

Затем я устанавливаю текущий индекс treeview на этот индекс. Что, я думаю, указывает на каталог. - может быть, это неправильно?

myTreeView->setCurrentIndex(idx);

Я попытался использовать selectionModel treeView, чтобы сделать выбор, используя этот индекс:

myTreeView->selectionModel()->select(idx, 
   QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);

Я также пытался получить доступ к дочернему каталогу и использовать его для установки текущего индекса и выбора:

QModelIndex next_index =myTreeView->currentIndex().child(1,0);
Но я все еще не получаю выбор на моем treeview.

контекст: для проекта обучения Qt я создаю средство просмотра изображений. У меня есть 'QTreeView' с поддержкой ' QFileSystemModel.- У пользователя есть возможность выбрать каталог изображений, и только содержимое этого каталога будет отображаться в QTreeView (то есть он не отображает всю файловую систему, а только подкаталог, который выбирает пользователь).

Я хотел бы, чтобы первый элемент в QTreeView был выбран, когда пользователь изменяет каталоги. Я видел этот вопрос (выбор строки в QTreeView программно ), но он не сработал для меня. Я копаюсь в этом уже несколько часов. Что я делаю? неправильно? Я могу выбирать каталоги и отображать изображения, но мне не хватает, как установить выбор QTreeView.

Мой код приведен ниже, с различными попытками прокомментировать. Вывод консоли из оператора qDebug всегда выглядит следующим образом:

Next_index -1 -1


void DirBrowser::on_actionSet_Image_Directory_triggered()
{
    QString dPath = QFileDialog::getExistingDirectory(this,
                     tr("Set Image Drectory"), QDir::currentPath());

    if (!dPath.isEmpty()) {

        QModelIndex idx = dirmodel->setRootPath(dPath);
        myTreeView->setRootIndex(idx);
        myTreeView->setCurrentIndex(idx);

        QModelIndex next_index =myTreeView->currentIndex().sibling(1,0);

        //QModelIndex next_index = myTreeView->model()->index(1, 0);
        //QModelIndex next_index =idx.child(0,0);
        qDebug() << "next_index" << next_index.row() << next_index.column();
        //myTreeView->setCurrentIndex(next_index);

        myTreeView->selectionModel()->select(next_index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);

        QString path = dirmodel->fileInfo(next_index).absoluteFilePath();
        qDebug() << "set Dir" << path;
    }
}
1 5
qt

1 ответ:

Понял это. Проблема заключалась в том, что я пытался сделать выбор в QTreeView до того, как указанный каталог был загружен. Другими словами, tryng, чтобы сделать выбор в рамках метода, где я менял каталоги.

Решение состоит в том, чтобы слушать для directoryLoaded(QString) SIGNAL это QFileSystemModel испускает.

void QFileSystemModel::directoryLoaded ( const QString & path ) [signal]

Этот сигнал испускается, когда поток сборщика завершает загрузку пути. Эта функция была введена в Qt 4.7.

connect(dirmodel,
         SIGNAL(directoryLoaded(QString)),
         this,
         SLOT(model_directoryLoaded(QString)));