qml TableView itemdelegate не срабатывает (используя QAbstractTableModel) - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь заставить мой первый QML TableView работать в Qt 5.2 (поскольку мы сейчас зациклены на этой версии на работе), используя QAbstractTableModel на бэкэнде.

Моя основная проблема что по какой-то причине itemDelegate никогда не стреляет, поэтому я никогда не вижу ничего в виде, кроме контура TableView. Я также проверил, что theData_ заполнен 2-мерными числами в каждой строке / столбце в конструкторе, и я делаю emit layoutChanged(), а также emit dataChanged() в конструкторе.

Я понимаю, что имею нет проверки ошибок для недопустимого QModelIndex в вызове data().

Я также вообще не реализовал index().

Также есть необходимость в использовании ROLE здесь?

Данные, которые я отображаю, представляют собой одно целое число (как QString) на ячейку, больше ничего в это время.

Спасибо за ваше help

qml:

TableView {
  width: 600
  height: 600

  model: myModel
  visible: true

  itemDelegate: Rectangle {
     color: "lightgray"
     width: 100
     height: 20

     Text {
        text: styleData.value
        color: "black"
     }
   }
}

соответствующий код из подкласса QAbstractTableModel:

int MyModel::rowCount(const QModelIndex&) const
{
return 10;
}

int MyModel::columnCount(const QModelIndex&) const
{
return 3;
}

QVariant MyModel::data(const QModelIndex& index, int role) const
{
const int row = index.row();
const int col = index.column();

return QString("%1").arg(this->theData_[col][row]);
}

1 Ответ

0 голосов
/ 24 апреля 2020

До Qt 5.12 существовал только компонент TableView, принадлежащий Qt QuickControl 1, который поддерживает только модель типа списка, где каждый столбец отражает информацию о роли, так что это, вероятно, ваша проблема, поскольку вы не создал ни одного TableViewColumn. С другой стороны, по состоянию на> = Qt5.12 уже существует TableView, который он поддерживает как модель табличного типа.

mymodel.h

#ifndef MYMODEL_H
#define MYMODEL_H

#include <QAbstractListModel>

struct Data{
    int number;
    QString text;
};

class MyModel : public QAbstractListModel
{
    Q_OBJECT
public:
    enum CustomRoles{
        NumberRole = Qt::UserRole,
        TextRole
    };
    explicit MyModel(QObject *parent = nullptr);
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;
private:
    QList<Data> m_data;
};

#endif // MYMODEL_H

mymodel. cpp

#include "mymodel.h"

MyModel::MyModel(QObject *parent)
    : QAbstractListModel(parent)
{
    // for test
    for(int i=0; i< 10; i++){
        Data d{i, QString::number(i)};
        m_data.push_back(d);
    }
}

int MyModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    return m_data.count();
}

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if(role == NumberRole)
        return m_data.at(index.row()).number;
    if(role == TextRole)
        return m_data.at(index.row()).text;
    return QVariant();
}

QHash<int, QByteArray> MyModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[NumberRole] = "number";
    roles[TextRole] = "text";
    return roles;
}

main.qml

// ...
TableView {
    width: 600
    height: 600

    model: myModel
    visible: true

    TableViewColumn {
        role: "number"
        title: "Number"
        width: 100
    }
    TableViewColumn {
        role: "text"
        title: "Text"
        width: 200
    }

    itemDelegate: Rectangle {
        color: "lightgray"
        width: 100
        height: 20

        Text {
            text: styleData.value
            color: "black"
        }
    }
}
// ...
...