【问题标题】:qt5 view different roles of model dataqt5查看不同角色的模型数据
【发布时间】:2014-04-15 14:43:08
【问题描述】:

我想使用 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 列包含真实对象是硬编码的,而其他列只是通过兄弟函数访问它。不过,我担心它很脆弱,因为更改列顺序会破坏它。

有明显的方法来管理它,但我只是想知道我是否采取了正确的方法。是否有更好的选择来显示同一项目的不同方面?

【问题讨论】:

    标签: qt qtableview


    【解决方案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;
        }
        [..]
    }
    

    【讨论】:

    • 正如我所说,提高健壮性的工作很明显,但整个设置感觉有点奇怪,所以我想知道是否有更好的整体策略。至于你的第二点,我没有问题使用数据函数来获得所需的角色。问题是如何显示不同的角色。例如,如果我在测试期间收集了数据,我可能希望显示实际数据、测试日期、测试机器等。
    • @ryan0270,说实话,我不明白这个问题。如果需要在不同的列中显示数据,根据 index.column() 的值从 data() 函数返回不同的值。
    • 但是同一个项目只能关联一个单元格,对吧?我不能让模型中的第 1 列和第 2 列都指向同一个项目。我试过了,Qt 给出了重复项目被添加到模型中的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2021-12-24
    • 2018-12-25
    • 2020-06-09
    相关资源
    最近更新 更多