Получение значения ячейки TableView в делегате Qml

Есть TableView заполняющаяся через QSqlQueryModel. В первой колонке boolean данные, ориентируясь на значение ячейки необходимо отрисовать в ней ту или иную иконку. Решил сделать через делегаты но не могу взять исходное значение.

Делегат:

Component {
    id: favoriteDelegate
    Item {
        Rectangle {
            id: rect
            anchors.centerIn: parent
            anchors.fill: parent
            Text{
            text: parent.parent.data[0].data[0].text
            }
        }
    }
}

Таблица:

TableView {
id:tableView

TableViewColumn {
    id:favcolumn
    width: 40
    role: "systems.favorites"
    title: "Fav"
    delegate: favoriteDelegate
}
model: myModel
}

Появляется исключение

depends on non-NOTIFYable properties

Видел реализацию делегатов в C++ но они все для виджетов, как применить их в Qml не совсем понимаю.

Так же пробовал переопределять в data():

QVariant ListModel::data(const QModelIndex & index, int role) const {
   if ( role==FavRole && index.column() == 0) {
      return QIcon("D:/Users/Downloads/ico.ico");
   }
}

Но в ячейку подставляется текст: No Icon in table((


Ответы (1 шт):

Автор решения: Александр Муксимов

Ваша проблема решается путем создания собственного класса, производного от QSqlQueryModel в котором перегружена функция QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) Ниже проверенный пример, который работает.

Определение класса, в котором в перегружаете QVariant data()

class ModifyQSqlQueryModel : public QSqlQueryModel 
{
 public:
  Q_OBJECT
    //Пишите свой вариант этой функции
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

 private:
    //Это номер колонки, в которой сидит Ваше булевого поле, которое Вы анализируете
    int MasterColumn;  

 public:
     ModifyQSqlQueryModel(QObject * parent = Q_NULLPTR);
     ~ModifyQSqlQueryModel();

     //С помощью этой функции Вы устанавливаете номер колонки с булевым значением
     void SetMasterColumn(int coll) { MasterColumn=coll;} ;

 };

Фрагмент переопределяемого метода

QVariant ModifyQSqlQueryModel::data(const QModelIndex &index, int role) const
{
        //Ваши иконки, которые Вы хотите показывать в зависимости от значения булевого поля (В качестве примера я выбрал стандартные иконы "+"и "-"
        QIcon icbY("C:/.../Icons/Add.png");
        QIcon icbN("C:/.../Icons/Delete.png");


        //Возвращаемое значение от базового класса по умолчанию
        QVariant value = QSqlQueryModel::data(index, role);

        switch (role)
        {
        case Qt::DecorationRole:

             if (index.column() != MasterColumn) return value;
             if (index.sibling(index.row(), MasterColumn).data().isNull()) return value;

             if (index.sibling(index.row(), MasterColumn).data().toBool())
                return icbY;
             else
                return icbN;
             break;
          default:
               return value;
          }

       return value;
    }

В таком виде все прекрасно работает. введите сюда описание изображения Это результат, который я получил. Если у Вас не работает мой пример, значит проблемы в Вашей реализации, а для этого нужен Ваш код.

→ Ссылка