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

相關問題