2011-09-06 166 views
1

我已經創建了一個QSortFilterProxyModel關閉我的QSqlTableModel並已成功添加一個額外的列,以便我可以添加一個差異字段,這將浪費數據庫表中的空間。爲什麼QSortFilterProxyModel.setData()返回false?

但是,關閉代理模型實例的setData函數返回false。沒有其他編譯或運行時錯誤發生。

QSortFilterProxyModel *balanceProxyModel = new QSortFilterProxyModel(this); 
balanceProxyModel->setSourceModel(balanceModel); 

// add a Diff column 
balanceProxyModel->insertColumn(6); 
balanceProxyModel->setHeaderData(
    6, Qt::Horizontal, QObject::tr("Difference")); 

for (int i = 0; i < balanceProxyModel->rowCount(); ++i) { 
    float budget = balanceProxyModel->index(i, 4).data().toFloat(); 
    float actual = balanceProxyModel->index(i, 5).data().toFloat(); 
    float difference = budget - actual; 

    if (balanceModel->setData(
     balanceModel->index(i, 6), QVariant(difference)) == false) { 
    qDebug() << ATLINE << ":" 
     << "diff not added!!!"; 
    } 

對於每條記錄,我都會得到「diff not added !!!」因爲setData失敗(返回false)。

謝謝。

- 更新20110907_0754-- 我試過ixM的建議,並修復了一個小錯誤,但沒有解決問題。我仍然(從使用setData函數或假回來。)得到「不加DIFF」

if (balanceProxyModel->setData(
    balanceProxyModel->index(i, 6), QVariant(difference)) == false) { 
    qDebug() << ATLINE << ":" 
    << "diff not added!!!"; 
} 

--update 20110907_2205-- 添加以下(順便說一下,不同的字段不顯示) :

qDebug() << "balanceProxyModel->insertColumn(6);"; 
qDebug() << balanceProxyModel->insertColumn(6); 

,得到了以下結果到stdout:

Debug: balanceProxyModel->insertColumn(6); 
Debug: true 

後來,我增加了以下的循環:

qDebug() << "balanceModel->index(i, 6);"; 
qDebug() << balanceModel->index(i, 6); 

到stdout:

Debug: balanceModel->index(i, 6); 
Debug: QModelIndex(128,6,0x0,QSqlTableModel(0x1d10bf0)) 

--update 20110908_2153-- 嗯,我沒有考慮在列設置屬性。這裏是你的測試結果:

qDebug() 
    << (bool)(balanceProxyModel->flags(diffModelIndex) & Qt::ItemIsEditable) 
    << (bool)(balanceProxyModel->flags(diffModelIndex) & Qt::ItemIsEnabled); 

結果:

Debug: false true 

從測試IXM建議,結果顯示,Qt的:: ItemIsEditable是假的。這回答了我的實際問題。當然,我仍然想知道如何設置該標誌。模型索引類沒有我可以看到的允許設置標誌的方法。也許在這一點上,我應該看看子類的代理類,讓它允許可編輯的列。

+0

我在編輯的答案 – ixM

+0

ixM中添加了更多關於您的代碼的問題,我添加了幷包含了您的調試建議。在循環中的那一點,i == 128. – jetimms

+0

在編輯後的最後一個問題。否則,我真的不知道:/ – ixM

回答

2

也許你應該讓balanceProxyModel->使用setData(balanceProxyModel->索引(i,6))

我覺得你使用了錯誤的模式存在;)

當遇到這樣的錯誤,你應該總是檢查索引方法返回的索引(在這種情況下,這可能是一個無效的索引)。

編輯>qDebug() << balanceProxyModel->insertColumn(6); 說什麼?該男子說,它將列插入給定列pos之前。也許你應該嘗試7而不是6?循環中有什麼qDebug() << balanceProxyModel->index(i, 6);

編輯2>好吧,我能想到的唯一的事情,是一個標誌,缺少該列。你能否粘貼qDebug() << (bool)(balanceProxyModel->flags() & Qt::ItemIsEditable) << (bool)(balanceProxyModel->flags() & Qt::ItemIsEnabled);的結果?

最後編輯>是的,我知道更改標記的唯一方法是對您正在使用的模型進行子類化。在Qt中有一些令人失望的東西:/

+0

啊,我看到你現在談論的錯誤。我想我已經這麼做了,並將其轉換爲測試,但讓我試試看。謝謝。 – jetimms

+0

我給了變化一個鏡頭(我找到了一個我以前曾經嘗試過的版本),但它沒有任何區別。 – jetimms

+0

我認爲你有一些東西。我需要設置Qt :: ItemIsEditable。我甚至沒有考慮過這將是一個不可編輯的列,但是這是有道理的,因爲您可以將其他大部分內容設置爲只讀。感謝您的幫助,ixM。 – jetimms