Как выбрать строку в 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 ответ:
Понял это. Проблема заключалась в том, что я пытался сделать выбор в
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)));