为什么QSortFilterProxyModel.setData()会返回false?

时间:2011-09-06 01:28:23

标签: qt model proxy

我已经从我的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。这回答了我的实际问题。当然,我想知道如何设置那个标志。模型索引类没有我可以看到允许设置标志的方法。也许在这一点上,我应该看一下子类化代理类,以使其允许可编辑的列。

1 个答案:

答案 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中有些东西有点令人失望:/