1

让我们假设,我有一个点列表。一个QTableView以笛卡尔坐标(x,y,z)显示列表。另一个QTableView显示每个点对任意选择的平面(x',y')的投影。现在,我想分享这两个视图之间的行选择。它应该无关紧要,用户在哪个视图中编辑选择。因为(x,y,z)不能通过简单的索引投影或排列变换为(x',y'),因此我很确定QAbstractProxyModel的导数不能立即使用。在语义不同的表格之间共享行选择

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

写一个连接列的整个模型,只是为了再次打破它,似乎很笨拙。但是,通过连接currentRowChanged来同步两个选择模型需要进行信号循环处理,并且接口不支持多个子模型。解决方法是否真的要走?还是有更好的?

最好的问候,玛丽安

附加信息(编辑4月2日):

  • 的解决方案应该是在拖行的下降健壮了。
  • 如果我有两个以上的转换,解决方案应该很好地扩展。转换视图可以独立使用,也可以像我描述的共享选定行一样使用。

回答

1

每个QtableView都有一个选择模型。对于两个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); 
    } 
} 
+0

我假设MyClass是某种_selection合并_类。这种方法的问题在于,如果选择多行,或者如果您有两个以上的视图,则它不能很好地扩展。我对代理模型的想法受到[Steveire的博客](http://steveire.wordpress.com/2010/04/20/sharing-a-qitemselection-between-views-through-proxy-models/)的启发。我觉得我必须选择两个邪恶中较小的一个。 – Marian

+0

我得出的结论是分享选择并不明确。选择包含一个焦点元素。由于两个表格的列都不具有可比性,因此没有明确的理性,应该集中哪个元素。这个答案很简单。它有它的问题。但是,从不明确的问题来看,只有解决方法才能解决。从所有变通办法来看,这似乎是一个很好的办法。 – Marian

相关问题