2011-11-24 347 views
4

我有一個QTableView,填充QStandardItemModel。
我經常通過網絡更新模型,模型也由用戶直接通過QTableView更新。QTableView,QStandardItemModel和信號

現在我喜歡叫,當用戶正在改變一些數據的方法,所以我也:

connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(dataChanged(QStandardItem*))); 

現在的問題是,我的dataChanged方法被調用,也當更新項目在網絡。

model->setData(index, new_val); 

有僅如果emited另一個信號,用戶正在改變的tableview裏面的東西???

回答

3

不,AFAIK沒有這樣的信號,但你有辦法破解它。

編輯QTableView中的項目時,activated信號將被命中。這個想法是捕獲這個信號,並將它連接到一個插槽,該插槽將存儲上次手動更改的項目。

connect(view, SIGNAL(activated(QModelIndex), this, SLOT(manuallyActivated(QModelIndex))); 

void manuallyActivated(QModelIndex index) 
{ 
    // This variable should be in your header file... 
    lastManuallyModifiedIndex = index; 
} 

現在只需修改dataChanged插槽,以檢查是否已更改的項目對應於最後修改項目。

void dataChanged(QStandardItem* item) 
{ 
    // If it is invalid simply ignore it... 
    if (lastManuallyModifiedIndex.isValid() == false) 
     return; 

    // only if it is modified manually we process it 
    if (item->index() == lastManuallyModifiedIndex) 
    { 
     // make last modified index invalid 
     lastManuallyModifiedIndex = QModelIndex(); 
     doSomething(); 
    } 
} 
+0

mhm看起來像一個很好的解決方法,我的問題。經過測試之後,看起來好像在選擇了物品並且進入hiting之後激活了信號,而不是通過內聯編輯 – nfo

+0

我會保持你的答案,因爲它有一個準確的解決方案,即使激活信號在我的情況下也沒有出現接縫像它的平臺依賴)我現在使用輸入的信號並激活鼠標跟蹤,這可能不是最好的解決方案,但它符合我的需要) – nfo

1

當您的網絡發生更新時,您可以阻止表格信號。

QObject::blockSignals(bool block) 

或者您可以聽取連續點擊和編輯事件。

相關問題