QlistView setCurrentIndex()不起作用

Posted

技术标签:

【中文标题】QlistView setCurrentIndex()不起作用【英文标题】:QlistView setCurrentIndex() not working 【发布时间】:2014-09-16 12:22:58 【问题描述】:

我遇到了 QListView 组件的问题。

我创建了一个带有列表视图和表格视图的简单表单。 然后我输入这段代码,两个小部件都按照我的意愿填充数据模型:

QSqlQueryModel * modela = new QSqlQueryModel();
QSqlQueryModel * modelb = new QSqlQueryModel();

[...]

ui->listView->setModel(modela);
ui->tableView->setModel(modelb);

[...]

void MyWindow::on_listView_clicked(const QModelIndex &index)

 ui->tableView->setCurrentIndex(ui->listView->currentIndex());


void MyWindow::on_tableView_clicked(const QModelIndex &index)

 ui->listView->setCurrentIndex(ui->tableView->currentIndex()); 
 // FAILS, does not react...  

第一个插槽(当我单击列表视图小部件中的任何项目时)按预期工作,它会自动选择表格视图小部件中的相应项目,但第二种情况不起作用,它只是没有选择列表视图中的任何项目...

我想要的是用户在表格视图中单击的任何项目都会在列表视图中被选中。

有可能吗? 我很努力,寻找示例和官方 qt 文档,但我没有找到正确的方法(也尝试连接信号/插槽,但我不知道如何准确连接两个小部件)。

提前致谢。

【问题讨论】:

你怎么知道选择什么?您使用表视图索引来选择列表视图中的项目?嗯…… 两个小部件的索引相同,因此如果用户单击 tableview 上的第三行,则必须选择(或突出显示)listview 的第三行。我目前正在尝试这个解决方案: void MyWindow::on_tableView_clicked(const QModelIndex &index) ui->listView->setCurrentIndex(ui->tableView->currentIndex()); ui->listView->selectionModel()->select(ui->listView->model()->index(ui->tableView->currentIndex().row(),0),QItemSelectionModel::SelectCurrent);它可以工作,但是这样做似乎很丑陋... 为什么不使用两个表视图或两个列表视图? @lando-calc-rissian 你走对了,看看我的回答 【参考方案1】:

QModelIndex 是某个QAbstractItemModel 的组成部分。这意味着您不能使用模型 A 中的索引来选择模型 B 视图中的项目。

QModelIndex 不仅仅是一对 x,y。它还保留一个指向创建它的模型的指针。

所以如果你需要选择与第一个视图中选择的相同的行,你需要从第一个索引中提取一行,然后在第二个模型中获取一个正确的索引并使用它来选择第二个视图中的一个项目:

void selectTheSameRow(const QModelIndex& indexFromModelA)

  int row = indexFromModelA.row();
  QModelIndex indexFromModelB = modelB->index(row, 0);
  viewB->setCurrentIndex(indexFromModelB);

【讨论】:

调用setCurrentIndex()并不意味着选择项目。 这取决于selectionMode,但在大多数情况下确实如此。看QItemSelectionModel::setCurrentIndex(模型调用这个方法)它转发到select @Ezee 你的回答很好地澄清了我对 QModelIndex 的误解,我想知道为什么仍然有一些小部件(如组合框)QModelIndex 似乎只是一个整数,但这是另一个话题......谢谢为您解答!

以上是关于QlistView setCurrentIndex()不起作用的主要内容,如果未能解决你的问题,请参考以下文章

来自其类外部的 QStackedWidget 的 setCurrentIndex

qt QComboBox setView 到 QTreeView 不能做 setCurrentIndex

来自其类外的QStackedWidget的setCurrentIndex

Qt - 如何将 QListView 项目转移到另一个 QListView?

如何将标题设置为 QListView

如何让QListView显示多列 QTableView与QListView区别在哪里