我遇到了QListView组件的问题。
我创建了一个包含listview和tableview的简单表单。 然后我把这个代码,两个小部件都填充了我想要的数据模型:
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...
}
第一个插槽(当我点击listview小部件中的任何项目时)按预期工作,它会自动选择tableview小部件中的相应项目,但第二个案例不起作用,它只是没有选择listview中的任何项目...
我想要的是用户在tableview中点击的任何项目都会在列表视图中被选中。
有可能吗? 我努力了,寻找示例和官方qt文档,但我找不到正确的方法(也尝试连接信号/插槽,但我不知道如何准确连接两个小部件)。
提前致谢。
答案 0 :(得分:2)
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);
}