我已經創建了一個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是假的。這回答了我的實際問題。當然,我仍然想知道如何設置該標誌。模型索引類沒有我可以看到的允許設置標誌的方法。也許在這一點上,我應該看看子類的代理類,讓它允許可編輯的列。
我在編輯的答案 – ixM
ixM中添加了更多關於您的代碼的問題,我添加了幷包含了您的調試建議。在循環中的那一點,i == 128. – jetimms
在編輯後的最後一個問題。否則,我真的不知道:/ – ixM