2013-11-28 78 views
1

我想阻止用戶輸入相同的數據到我的模型中,這是從QAbstractTableModel subclassed。QTableView ::編輯(常量QModelIndex&索引)失敗

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    bool result = false; 
    ... 
    // Test if my model already has the same data 
    result = findItem(value.toString()) != -1; 
    ... 
    if (result) 
     emit(dataChanged(index, index); 
    else 
     emit (dataInvalid(index)); 

    return result; 
} 

現在我應該抓住的信號,並把我的表視圖(哪種類型QTableView中)回編輯狀態:

void MyWindow::dataInvalid(const QModelIndex &index) 
{ 
    myTableView->edit(index); 
} 

但是當我運行我的應用程序在控制檯得到消息和QTableView中不會變成編輯狀態:

edit: edit failed 

我在做什麼錯? 非常感謝您提前。

+0

我認爲它失敗了,因爲當你在你的視圖上調用edit()時,它仍然處於編輯模式,並且setData()函數還沒有退出。 – vahancho

+0

非常感謝,@vahancho! 當連接到'dataInvalid'信號時,我添加了'Qt :: QueuedConnection',它工作正常! 問題是因爲當我調用'QTableView :: edit(const QModelIndex&index)'時,'QTableView'仍然在'QAbstractItemView :: EditState'中**。 謝謝! – pau

回答

1

當調用

myTableView->edit(index) 

我看來仍然QAbstractItemView中:: EditState,這是失敗的原因。 解決方案是連接到信號時添加的Qt :: QueuedConnection

MyWindow::MyWindow() 
{ 
    ... 
    connect(myModel, SIGNAL(dataInvalid(QModelIndex)), 
     this, SLOT(dataInvalid(QModelIndex)), Qt::QueuedConnection); 
    ... 
} 

現在一切工作正常。