我正在尝试掌握如何将数据库中的数据显示到Qt表中。我想要做的是将布尔值的显示值更改为“通过”或“失败”,然后根据此更改行的颜色。
我已经为模型创建了一个QSqlQueryModel
派生类,并覆盖了该函数:
QVariant TestResultsViewModel::data(const QModelIndex &index, int role) const
{
QVariant value = QSqlQueryModel::data(index, role);
if (value.isValid() && role == Qt::DisplayRole){
switch(index.column()){
case 0:
return value.toBool() ? "PASS" : "FAIL";
}
}
if (role == Qt::TextColorRole){
// Get column 0
QVariant pass = index.sibling(index.row(), 0).data();
if (pass.isValid()){
if (pass.toBool()){
return QVariant::fromValue(QColor(Qt::blue));
}
else{
return QVariant::fromValue(QColor(Qt::red));
}
}
}
return value;
}
但似乎发生的情况是,第一部分先完成,然后列的值是“通过”或“失败”,而不是0,1,因此颜色不会改变。
那么我到底该怎么做呢?
发布于 2012-06-12 14:09:24
QModelIndex::data()的实现解释了这种行为:
inline QVariant QModelIndex::data(int arole) const
{ return m ? m->data(*this, arole) : QVariant(); }
其中m是模型索引的模型。
这意味着您的呼叫
index.sibling(index.row(), 0).data();
最后再次调用TestResultsViewModel::data()
,这意味着你确实得到了“通过”或“失败”的结果。
为了避免这种情况,您可以执行以下操作:
QModelIndex firstColumnIndex = index.sibling( index.row(), 0 );
QVariant pass = QSqlQueryModel::data( firstColumnIndex );
这将显式调用QSqlQueryModel::data()
而不是TestResultsViewModel::data()
,并跳过您的代码
https://stackoverflow.com/questions/10997387
复制