Е
2 декабря 2020 г. 22:19

Qml, tableview

qml, TableView, TableViewColumn

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

3

Вам это нравится? Поделитесь в социальных сетях!

3
ДК
  • 2 декабря 2020 г. 22:29

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

    Е
    • 3 декабря 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 на всю строку

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

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

      1. TableView {
      2. // ....
      3. Connections {
      4. id: connectionsOnDataChanged
      5. target: cppModel
      6. function onDataChanged(topLeft, bottomRight, role) {
      7. connectionsOnDataChanged.enabled = false
      8. cppModel.updateRowData(topLeft)
      9. }
      10. }
      11.  
      12. Connections {
      13. target: cppModel
      14. function onUpdateRowDataCompleted() {
      15. connectionsOnDataChanged.enabled = true
      16. }
      17. }
      18. }

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь