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

162
22 апреля 2022, 15:20

Есть 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");
   }
}

Но в ячейку подставляется текст:

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

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

READ ALSO
задача не проходит по времени

задача не проходит по времени

В соревнованиях по хоккею участвует N командСколько существует вариантов распределения комплектов золотых, серебряных и бронзовых медалей,...

107
Как передать массив в функцию и вернуть его?

Как передать массив в функцию и вернуть его?

Я знаю что во всех почти других языка есть такой тип метода как int[] и я могу вернуть, массив который я передал

93
Генерация матриц на c++

Генерация матриц на c++

возникла необходимость создавать с помощью c++ матрицы 10 на 10 из нулей и единиц (всегда 25 единиц и 75 нулей в случайных позициях)При этом генерировать...

89
сортировка очереди на основе массива

сортировка очереди на основе массива

Прошу помочь реализовать сортировку очереди, реализованную на основе массиваСортировка может быть любой, интересно было бы посмотреть быструю...

154