使用代理将虚拟列添加到Qt SQL模型

时间:2016-09-14 13:53:00

标签: c++ qt

我使用 QSqlTableModel 在视图中显示SQL表。

我想根据行数据显示其他状态列,因为我使用自定义 QIdentityProxyModel ,其中我增加 columnCount 并返回数据< / em>用于 QSqlTableModel 中不存在的新虚拟列。

int MyProxyModel::columnCount(const QModelIndex& parent) const
{
    return sourceModel() ? (sourceModel()->columnCount() + 1) : 0;
}

QVariant MyProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (section == columnCount()-1 && 
        orientation == Qt::Horizontal &&
        role == Qt::DisplayRole) 
    {
        return tr("MyHeader");
    }

    return QIdentityProxyModel::headerData(section, orientation, role);
}

QVariant MyProxyModel::data(const QModelIndex &proxyIndex, int role) const
{
    qDebug() << "data " << proxyIndex.row() << proxyIndex.column(); 
    // ...never called for my extra column (== columnCount()-1)

    if (proxyIndex.column() == columnCount()-1 && role == Qt::DisplayRole)
        return QString("I am virtual");

    return QIdentityProxyModel::data(proxyIndex, role);
}

编辑: 我更改了代码,以便更简单地了解评论。我仍然有同样的问题。

我的问题是视图从不向我的虚拟列请求数据,它为实际SQL表的所有其他列调用 data()但不是最后一个虚拟列,我错过了什么? 此外,标题数据适用于我的额外列,问题仅在于数据。视图绘制了额外的列,但内容为空(即使交替的行背景未绘制)。 谢谢!

2 个答案:

答案 0 :(得分:1)

m_mySqlTableColumnCount成员是不必要的。您必须通过监听更新列数的源模型信号来确保它始终正确。唉,这是不必要的。您希望将列计数请求传递到源模型:

int MyProxyModel::columnCount(const QModelIndex& parent) const
{
    return sourceModel() ? (QIdentityProxyModel::columnCount() + 1) : 0;
}

然后:

QVariant MyProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (section == columnCount()-1 && 
        orientation == Qt::Horizontal &&
        role == Qt::DisplayRole) 
    {
        return tr("MyHeader");
    }    
    return QIdentityProxyModel::headerData(section, orientation, role);
}

QVariant MyProxyModel::data(const QModelIndex &proxyIndex, int role) const
{
    if (proxyIndex.column() == columnCount()-1) {
      qDebug() << proxyIndex.row() << proxyIndex.column();
      ...
    }
    return QIdentityProxyModel::data(proxyIndex, role);
}

答案 1 :(得分:0)

视图需要获取虚拟列的QModelIndex个对象,因此我还需要覆盖代理中的index函数:

QModelIndex MyProxyModel::index(int row, int column, const QModelIndex &parent) const
{
    if (column == columnCount()-1)
        return createIndex(row, column);

    return QIdentityProxyModel::index(row, column);
}

我不介意父,因为我只有一个表(来自数据库),但我不知道如果需要可以处理它,因为createIndex不允许指定父。