2011-09-06 178 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

相关问题