2

Qt Item 角色机制是如何实现的?只是存储在支持角色的类中的某种映射?

4

1 回答 1

2

项目角色用于检索给定模型索引的不同数据,例如列表模型中的文本、图标、工具提示等。它们的实现方式取决于模型。

QStandardItemModel 确实在内部使用了 QMap(角色到值)。

对于自定义模型,通常使用 if 或 switch 语句为不同的角色返回不同的数据:

QVector<SomeObject> m_data;

QVariant SomeListModel::data( const QModelIndex& index, int role ) const {
    const SomeObject& so = m_data[index.row()];
    switch ( role ) {
    case Qt::DisplayRole:
        return so.name();
    case Qt::DecorationRole:
        return so.icon();
    case Qt::ToolTipRole:
        return so.details();
    case SomeObjectRole: // Custom role, SomeObjectRole=Qt::UserRole
        return QVariant::fromValue<SomeObject>( so );
    default:
        break;
    }

    return QVariant();
}

快速的 index() 和 data() 方法对于获得高效的模型很重要,因此要避免映射查找以及与项目数量(此处为 m_data 的大小)相关的其他所有不是 O(1) 的事情。

于 2013-01-13T23:10:11.130 回答