我已经创建了一个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