Как получить доступ к Qt :: DisplayRole и указать столбцы в TableView - PullRequest
0 голосов
/ 07 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Если вы планируете использовать модель несколько раз, вы можете рассмотреть подкласс QFileSystemModel и добавить пользовательскую роль:

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

Таким образом, вы можете просто обратиться к роли по ее имени:

TreeView {
    model: fsModel
    anchors.fill: parent

    TableViewColumn {
        role: "display"
    }
    TableViewColumn {
        role: "fileSize"
    }
}
0 голосов
/ 07 мая 2018

Если вы хотите получить доступ к делегату, вы должны использовать styleData.index, который возвращает QModelIndex и передать ему значение роли, в данном случае Qt::DisplayRole, что соответствует документам is 0:

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

если вы знаете строку, столбец и QModelIndex родительского элемента:

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