如何以编程方式在QTreeview中选择行?

No *_*ing 6 qt

更新:让我尝试简化问题和步骤.有谁看到我哪里出错了?此外,这是在OSX 10.7.5/Qt 5.1上 - 也许这是一个OSX问题?

我传递一个指向图像目录的绝对路径,并设置我的QFileSystemModel实例的根路径,并使用它返回的索引来设置我的QTreeView实例根索引

QModelIndex idx = dirmodel->setRootPath(dPath);
myTreeView->setRootIndex(idx);
Run Code Online (Sandbox Code Playgroud)

然后,我将树视图的当前索引设置为该索引.我猜这是指向目录 - 也许这是错的?

myTreeView->setCurrentIndex(idx);
Run Code Online (Sandbox Code Playgroud)

我尝试使用treeView的selectionModel来使用该索引进行选择:

myTreeView->selectionModel()->select(idx, 
   QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
Run Code Online (Sandbox Code Playgroud)

我还尝试访问目录的子节点并使用它来设置当前索引和选择:

QModelIndex next_index =myTreeView->currentIndex().child(1,0);
Run Code Online (Sandbox Code Playgroud)

但我仍然没有在我的树视图上进行选择.


上下文:对于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

No *_*ing 4

弄清楚了。问题是我试图在QTreeView指定目录完成加载之前进行选择。换句话说,尝试在我更改目录的方法中进行选择。

解决方案是监听发出的directoryLoaded(QString) SIGNAL信号QFileSystemModel

void QFileSystemModel::directoryLoaded ( const QString & path ) [signal]
Run Code Online (Sandbox Code Playgroud)

当收集器线程完成加载路径时,会发出此信号。该功能是在 Qt 4.7 中引入的。

connect(dirmodel,
         SIGNAL(directoryLoaded(QString)),
         this,
         SLOT(model_directoryLoaded(QString)));
Run Code Online (Sandbox Code Playgroud)