Е
02 грудня 2020 р. 22:19

Qml, tableview

qml, TableView, TableViewColumn

Есть tableview и модель описанная в c++, как я могу в зависимости от значения в ячейке менять цвет всей строки?

3

Вам це подобається? Поділіться в соціальних мережах!

3
ДК
  • 02 грудня 2020 р. 22:29

через делегат
https://evileg.com/ru/post/624/

    Е
    • 03 грудня 2020 р. 22:53

    это я понимаю, проблема в том, что при изменении данных в модели, само содержание ячейки меняется, а вот метод для ее окраски в зависимости от содержания, не вызывается

      P
      • 20 березня 2021 р. 14:06
      • (відредаговано)

      Аналогично, нужно подсвечивать выбранные строки, строку можно выбрать, нажав по любой ячейке. В моделе сохраняется состояние строки. При нажатии обновляется только ячейка, по которой нажал, а не вся строка. При скролинге, после выхода строки из области видимости выбранные строки отображаются полностью подсвеченные.

      Получается, что делегат обновляется по сигналу:
      void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector ())

      topLeft и bottomRight - задает диапазон данных которые обновились, в данном случае это одна ячейка.
      Чтобы обновить строку, можно послать сигнал dataChanged, изменив topLeft и bottomRight на всю строку

      //cppModel
      void EffectProxyTableModel::updateRowData(const QModelIndex &topLeft)
      {
          QModelIndex newTopLeft = topLeft.model()->index(topLeft.row(), 0);
          QModelIndex newBottonRight = topLeft.model()->index(topLeft.row(), columnCount());
          emit dataChanged(newTopLeft, newBottonRight, QVector<int>());
          emit updateRowDataCompleted();
      }
      

      и в QML на время надо отключать обработку сигнала dataChanged:

      TableView {
          // ....
          Connections {
              id: connectionsOnDataChanged
              target: cppModel
              function onDataChanged(topLeft, bottomRight, role) {
                  connectionsOnDataChanged.enabled = false
                  cppModel.updateRowData(topLeft)
              }
          }
      
          Connections {
              target: cppModel
              function onUpdateRowDataCompleted() {
                  connectionsOnDataChanged.enabled = true
              }
          }
      }
      

        Коментарі

        Only authorized users can post comments.
        Please, Log in or Sign up