首页 文章

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

提问于
浏览
1

我想使用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 回答

  • 1

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

    enum ColumnNumber {
        Base,
        Sub1,
        Sub2
    }
    

    在你的代表的代码中:

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

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

    WRT项目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;
        }
        [..]
    }
    

相关问题