qt5查看模型数据的不同角色

时间:2014-04-14 22:39:16

标签: qt qtableview

我想使用QTableView来显示项目的不同角色,例如第1列显示DisplayRole数据,第2列显示UserRole,第3列显示UserRole + 1等

我通过创建自己的项目委托并将其分配给相应的列来创建此项。但是,为了访问相同的项目,代理人必须访问他们的兄弟姐妹。例如,这是我的setEditorData函数:

void UserRoleDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QModelIndex baseIndex = index.sibling(index.row(),0);
    QVariant v = baseIndex.data(Qt::UserRole);
    if(v.isValid())
        static_cast<QLineEdit*>(editor)->setText(v.toString());
}

现在,它是硬编码的,第0列包含真实对象,而其他列只是通过兄弟函数访问它。不过,我担心,改变列顺序会破坏它,这很脆弱。

有明显的方法可以解决这个问题,但我只是想知道我是否采取了正确的方法。是否有更好的选择来显示同一项目的不同方面?

1 个答案:

答案 0 :(得分:1)

为了避免可能的代码重写,您可以使用枚举作为列号。例如:

enum ColumnNumber {
    Base,
    Sub1,
    Sub2
}

在你的代表的代码中:

[..]
QModelIndex baseIndex = index.sibling(index.row(), Base);

因此,如果您需要更改列顺序,只需更改枚举值的顺序即可。其余的代码将正常工作。

WRT to item delgate用法 - 看起来很奇怪。过去在模型类中做过的事情,特别是在QAbstractItemModel::data(...)函数中,使用Qt::EditRole角色。例如:

QVariant Model::data(const QModelIndex &index, int role) const
{
    if (role == Qt::EditRole) {
        // Get the data that stored in the first column
        // ..
        return data;
    }
    [..]
}