如何访问Qt :: DisplayRole并在TableView中指定列

时间:2018-05-07 16:03:32

标签: c++ qt qml qt5 qfilesystemmodel

QFileSystemModel具有以下data功能:

Variant QFileSystemModel::data(const QModelIndex &index, int role) const
{
    Q_D(const QFileSystemModel);
    if (!index.isValid() || index.model() != this)
        return QVariant();

    switch (role) {
    case Qt::EditRole:
    case Qt::DisplayRole:
        switch (index.column()) {
        case 0: return d->displayName(index);
        case 1: return d->size(index);
        case 2: return d->type(index);
case 3: return d->time(index);

我想知道如何访问DisplayRole并在QML TableViewColumn中指定我想要的列。

我想在

中使用它
TableView {
  model: fileSystemModel
 TableViewColumn {
   role: //what comes here?
 }
}

4 个答案:

答案 0 :(得分:1)

如果您想在委托中访问,则必须使用返回styleData.index的{​​{1}}并向其传递角色的值,在本例中为QModelIndex,根据{ {3}}是Qt::DisplayRole

0

如果您知道父级的行,列和QModelIndex:

view.model.data(styleData.index, 0)

答案 1 :(得分:1)

如果您计划多次重用该模型,可以考虑对QFileSystemModel进行子类化并添加自定义角色:

bool

这样,您只需通过名称来引用该角色:

class FileSystemModel : public QFileSystemModel
{
public:

    explicit FileSystemModel(QObject *parent = nullptr) : QFileSystemModel(parent) {}

    enum Roles {
        FileSizeRole = Qt::UserRole + 1
    };

    QVariant data(const QModelIndex &index, int role) const
    {
        switch (role) {
        case FileSizeRole:
            return QFileSystemModel::data(this->index(index.row(), 1, index.parent()),
                                          Qt::DisplayRole);
        default:
            return QFileSystemModel::data(index, role);
        }
    }

    QHash<int, QByteArray> roleNames() const
    {
        auto result = QFileSystemModel::roleNames();
        result.insert(FileSizeRole, "fileSize");
        return result;
    }
};

答案 2 :(得分:1)

QFileSystemModel继承自QAbstractItemModel,后者具有一个名为roleNames()的方法,该方法返回带有默认Roles名称(例如DysplayRole,DecorationRole,EditRole等)的QHash。请参见:https://doc.qt.io/qt-5/qabstractitemmodel.html#roleNames。准确地说,QFileSystemModel在QAbstracItemModel之上定义了自己的角色。参见:https://doc.qt.io/qt-5/qfilesystemmodel.html#Roles-enum

因此,如果您没有定义任何自定义角色,则可以在QML文件中简单地引用显示角色及其默认名称(显示)。像这样:

TableView {
  model: fileSystemModel
 TableViewColumn {
   role: "display"
 }
}

也就是说,如果您定义自定义角色,则必须重写那个roleNames()方法,以便为您定义的新角色命名。在这种情况下,为了保持与父类的一致性,应首先调用QAbstractItemModel :: roleNames()方法(在您的情况下为QFileSystemModel :: roleNames()),然后在返回的QHash中设置新的角色名。这是一个登录项目的示例,其中我定义了主机,用户名和密码角色:

QHash<int, QByteArray> LoginModel::roleNames() const
{
    QHash<int,QByteArray> names = QAbstractItemModel::roleNames();
    names[HostRole] = "host";
    names[UsernameRole] = "username";
    names[PasswordRole] = "password";
    return names;
}

答案 3 :(得分:0)

您还可以简单地使用model.display或仅使用display从任何模型中获取DisplayRole。