我想使用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列包含真实对象,而其他列只是通过兄弟函数访问它。不过,我担心,改变列顺序会破坏它,这很脆弱。
有明显的方法可以解决这个问题,但我只是想知道我是否采取了正确的方法。是否有更好的选择来显示同一项目的不同方面?
答案 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;
}
[..]
}