在语义不同的表之间共享行选择

时间:2014-04-01 15:12:56

标签: qt drag-and-drop selection qtableview qsortfilterproxymodel

让我们假设,我有一个积分清单。一个QTableView以笛卡尔坐标(x,y,z)显示列表。另一个QTableView显示每个点到任意选择的平面(x',y')的投影。现在,我想在这两个视图之间共享行选择。无论如何,用户在哪个视图中编辑选择。

我很确定QAbstractProxyModel衍生物不能立即使用,因为(x,y,z)不能通过简单的索引投影转换为(x',y'),或排列。

解决方法:(x,y,z)和(x',y')的两个模型由第三个模型连接(x,y,z,x& #39;,y')行。现在,两个QSortFilterProxyModels再次分解了连接的列。任何视图的每个选择实际上都是(x,y,z,x',y')行的选择,因此共享。

看起来很笨拙,写一个加入列的整个模型,只是为了再次打破它们。但是,通过连接currentRowChanged来同步两个选择模型需要信号循环处理,而QAbstractProxyModel接口不支持多个子模型。解决方法真的要走了吗?还是有一个更好的?

最好的问候,玛丽安

其他信息(4月2日编辑):

  • 解决方案也应该在拖放行的情况下保持稳定。
  • 如果我有两个以上的转换,解决方案应该可以很好地扩展。转换的视图可以单独使用,也可以像我描述的那样共享选定的行。

1 个答案:

答案 0 :(得分:1)

每个QtableView都有一个Selection模型。对于两个QtableView中的每一个,您可以将选择模型的信号currentChanged连接到一个插槽,通过setCurrentIndex更改另一个QtableView的选择。这可以这样做:

QObject::connect(ui->tableView1->selectionModel(),SIGNAL(currentChanged(QModelIndex,QModelIndex)),this,SLOT(onCurrentChanged1(QModelIndex,QModelIndex)));

QObject::connect(ui->tableView2->selectionModel(),SIGNAL(currentChanged(QModelIndex,QModelIndex)),this,SLOT(onCurrentChanged2(QModelIndex,QModelIndex)));

void MyClass::onCurrentChanged1(QModelIndex curIndex, QModelIndex prevIndex)
{
    int newRow = curIndex.row();
    int curRow = ui->tabaleView2->selectionModel()->currentIndex().row();
    if( newRow != curRow )
    {
        QModelIndex newIndex = ui->tabaleView2->model()->index(row, 0);
        ui->tabaleView2->setCurrentIndex(newIndex);
    }
}
void MyClass::onCurrentChanged2(QModelIndex curIndex, QModelIndex prevIndex)
{
    int newRow = curIndex.row();
    int curRow = ui->tabaleView1->selectionModel()->currentIndex().row();
    if( newRow != curRow )
    {
        QModelIndex newIndex = ui->tabaleView1->model()->index(row, 0);
        ui->tabaleView1->setCurrentIndex(newIndex);
    }
}