我已经从我的QSqlTableModel创建了一个QSortFilterProxyModel并成功添加了一个额外的列,以便我可以添加一个差异字段,这将浪费数据库表中的空间。
但是,代理模型实例的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的建议,并修复了一个小错误,但它没有解决问题。我仍然得到“diff not added”(或者从setData函数返回错误。)
if (balanceProxyModel->setData(
balanceProxyModel->index(i, 6), QVariant(difference)) == false) {
qDebug() << ATLINE << ":"
<< "diff not added!!!";
}
- 更新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) )
- 更新20110908_2153-- 嗯,我没有考虑在列上设置属性。以下是您的测试结果:
qDebug()
<< (bool)(balanceProxyModel->flags(diffModelIndex) & Qt::ItemIsEditable)
<< (bool)(balanceProxyModel->flags(diffModelIndex) & Qt::ItemIsEnabled);
结果:
Debug: false true
从ixM建议的测试中,结果显示Qt :: ItemIsEditable为false。这回答了我的实际问题。当然,我想知道如何设置那个标志。模型索引类没有我可以看到允许设置标志的方法。也许在这一点上,我应该看一下子类化代理类,以使其允许可编辑的列。
答案 0 :(得分:2)
也许你应该制作balanceProxyModel-&gt; setData(balanceProxyModel-&gt; index(i,6))
我认为你在那里使用了错误的模型;)
遇到此类错误时,应始终检查索引方法返回的索引(在这种情况下,可能是无效索引)。
编辑&gt; qDebug() << balanceProxyModel->insertColumn(6);
是什么
说?该男子说它在给定列pos之前插入了列。也许你应该尝试7而不是6?循环中qDebug() << balanceProxyModel->index(i, 6);
是什么?
编辑2&gt;好吧,我唯一能想到的是,该列缺少一个标志。您可以粘贴qDebug() << (bool)(balanceProxyModel->flags() & Qt::ItemIsEditable) << (bool)(balanceProxyModel->flags() & Qt::ItemIsEnabled);
的结果吗?
上次修改&gt;是的,我知道更改标志的唯一方法是子类化您正在使用的模型。 Qt中有些东西有点令人失望:/