qt - 如何滚动到QListView中的特定项目?

标签 qt pyqt pyqt5 qt5.4

我正在使用 PyQt5 并在 IconMode 中有一个 QListView(带有自定义委托(delegate),可以想象为缩略图查看器)。
当我单击某个项目并使用光标键进行导航时,一切都很好。但是,当我以编程方式选择一个项目并随后按光标键时,选择会跳转到第一个项目。另外,listView.scrollTo(index) 不执行任何操作。我完全不知所措......
在选择项目的函数中,这就是我所做的:

listView.selectionModel().select(QtCore.QItemSelection(index, index), QtCore.QItemSelectionModel.ClearAndSelect)
listView.scrollTo(index)
listView.setCurrentIndex(index)

发生的情况是选择了新项目(在我的委托(delegate)的绘制函数中,option.state具有QtWidgets.QStyle.State_Selected标志),但 View 没有不要滚动使其可见。该项目也是“当前”的(listView.currentIndex() 返回新索引)。
当我按下“向下”光标键时, View 中的第一个项目将被选中并成为当前项目,并且 View 滚动到第一个项目。
顺便说一句,如果我省略对 selectionModel().select(...) 的调用,行为是相同的。

最佳答案

我在 Qt 5.15.6 上使用 C++ 时遇到了同样的问题。我使用的 QListView 有两列,其中仅显示一列(另一列是数据库中的索引键:我需要保留它,以便我可以在 ListView 中搜索特定的 id,以便我可以选择从程序中获取。

我从 QAbstractItemModel::match() 获得了 QModelIndex,但使用它来创建 QItemSelection 不起作用。然后我意识到 QItemSelection 有两个参数:左上和右下,而且我不知道我获得的 QModelIndex 引用了哪一列。因此,为了安全起见,我使用siblingAtColumn(0) 和siblingAtColumn(1) 创建了另外两个QModelIndex。

使用 QItemSelection 构造函数中的那些选择了适当的项目 - 但我们仍然没有滚动到它。然后我意识到我用于该函数的 QModelIndex 可能引用了第 0 列——它没有显示在我的实现中。将其更改为第 1 列的 QModelIndex 可以使其正确滚动。

也许我给你的一些想法可以回答你的问题。特别是,检查scrollTo() 的第一个参数是否引用您正在显示的列。如果您要显示多于一列,请指向左侧的一列(当然,我是在这里猜测的)。

这是生成的代码:

Ui::MainWindow *pMainWindow = MainWindow::getMainWindowPtr();
    pMainWindow->itemsListView->setCurrentIndex(itemIndex);

    QModelIndex itemIndex0 = itemIndex.siblingAtColumn(0);
    QModelIndex itemIndex1 = itemIndex.siblingAtColumn(1);
    QItemSelection *selection = new QItemSelection(itemIndex0, itemIndex1);
    QItemSelectionModel *itemSelectionModel = pMainWindow->itemsListView->selectionModel();
    itemSelectionModel->select(*selection, QItemSelectionModel::SelectCurrent);

    pMainWindow->itemsListView->scrollTo(itemIndex1, QAbstractItemView::EnsureVisible);

关于qt - 如何滚动到QListView中的特定项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31249018/

相关文章:

c++ - 以编程方式(C++)为所有 QProgressBars 的 Qt 样式表

python - 使用 Pyqt5 为按钮添加功能

python - PyQt5 接收器

javascript - 使用 Python 在后台使用 Thread 运行 javascript

qt - QML,将多个网格组合成单个实体

c++ - Qt单元测试依赖问题

c++ - 在 Qt 中使用 TCPServer 时浏览器连接重置

python - 如何设置像素图的最大宽度和高度?

python - 在 Python GUI (PyQt) 中运行外部 exe

python - PyQt5。多重继承和 __new__