简体   繁体   中英

How to access Qt::DisplayRole and specify columns in TableView

The QFileSystemModel has the following data function:

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);

I wonder how I can access the DisplayRole and specify the column I want in a QML TableViewColumn .

I want to use it in

TableView {
  model: fileSystemModel
 TableViewColumn {
   role: //what comes here?
 }
}

If you want to access within a delegate you have to use styleData.index that returns the QModelIndex and pass it the value of the role, in this case Qt::DisplayRole that according to the docs is 0 :

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

if you know the row, column and QModelIndex of parent:

view.model.data(view.model.index(row, colum, ix_parent), 0)

If you plan to reuse the model several times, you could consider sub-classing QFileSystemModel and add a custom role:

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;
    }
};

This way, you can simply refer to the role by its name:

TreeView {
    model: fsModel
    anchors.fill: parent

    TableViewColumn {
        role: "display"
    }
    TableViewColumn {
        role: "fileSize"
    }
}

QFileSystemModel inherits from QAbstractItemModel, which has a method called roleNames(), that returns a QHash with the names of the default Roles (eg DysplayRole, DecorationRole, EditRole etc..) see: https://doc.qt.io/qt-5/qabstractitemmodel.html#roleNames . To be accurate, QFileSystemModel defines its own roles on top of the QAbstracItemModel ones. see: https://doc.qt.io/qt-5/qfilesystemmodel.html#Roles-enum

So if you didn't define any custom role, then you can simply refer to the display role with it's default name (display) in your QML file . Like this:

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

That said, if you define custom roles, you have to override that roleNames() method, to give names to the new roles you defined. In that case, in order to keep consistency with the parent class, you should call first QAbstractItemModel::roleNames() method (in your case QFileSystemModel::roleNames()), and then set the new rolenames in the returned QHash. Here is an example for a login item where I defined host, username and password roles:

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM