2013-07-22 119 views
3

我有QTableView自定義表模型。用戶可以選擇表中的行,並且在特定情況下我想阻止當前選擇的更改。QTableView - 如何防止選擇更改

重新選擇之前選擇的行不是一個理想的解決方案(有關更改的信號被命中)。

那麼easies解決方案是什麼?

有沒有我看不到的選項?

我需要繼承QTableView嗎?

+0

你有沒有找到你滿意的解決方案? –

回答

3

你可以用QAbstractItemView::setSelectionMode(QAbstractItemView::NoSelection)

不能選擇一個視圖,您可以在每個項目的基礎上做到這一點,使用Qt :: ItemIsSelectable

Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex & index) const [virtual]

編輯(評論):

你有一個自定義模型,所以你可以設置一個當前行成員變量。然後,覆蓋標誌:

Qt::ItemFlags YourModel::flags(const QModelIndex & index) const 
{ 
    if(_current_row > 0 && index.row() != _current_row) 
    { 
    return QAbstractItemModel::flags() | ^Qt::ItemIsSelectable; 
    } 
    else 
    { 
    return QAbstractItemModel::flags() | Qt::ItemIsSelectable; 
    } 

} 

當然,dindt試過,但你明白了。

更新所以,如果你設置到CURRENT_ROW -1,都是可選擇的

+0

這隻適用於部分情況。它不允許選擇另一行,但是當我單擊我當前選定的行時未被選中。我想保留我原來的選擇。 – Johny

+0

嗯,我給你2個選項。用第二個覆蓋標誌(),可以使每個項目不可選,但是當前行。我會用一個例子更新我的文章。 – Trompa

+0

我明白了,我測試了這個解決方案 - 但正如我所說的 - 當我點擊不可選擇的行時,我失去了原來的選擇。 – Johny

-1

您可以重新選擇之前選定的行。在信號處理程序中,在重新選擇前調用blocksignals(true),然後調用blocksignals(false)以再次發送信號。

+0

但是選擇改變的信號已經被第一次改變觸發了(不是爲了reseled而已) – Trompa