МА
2 июня 2020 г. 0:12

Qt- C++ QTableView подсветить строку

Задача- подсветить строку таблицы при наведении мыши.
Использую модель на базе примера 39- го урока.
Там при переопределенном методе Data я раскрашиваю строки тельняшкой.
Как делается подсветка строки при наведении мыши? Не нажатии, а наведении.
И делать это в TableView или в модели?

3

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

13
IscanderChe
  • 2 июня 2020 г. 0:33

Это делается при помощи делегата.

    Evgenii Legotckoi
    • 2 июня 2020 г. 13:03

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

    https://evileg.com/ru/forum/topic/962/

      МА
      • 2 июня 2020 г. 19:03

      А если без делегата?
      В переопределенном классе

      1. TableModel::TableModel(QObject *parent) : QSqlTableModel(parent)

      там же где и метод data переопределен вызвать раскраску отдельного ряда как?

      В основной форме при наведении мыши, вызывается метод

      1. void Customers::on_tableView_entered(const QModelIndex &index)
      2. {
      3.  
      4. }

      в нем можно вызвать метод из модели нашего переопределенного класса.
      А в нем как раскрасить?

        Evgenii Legotckoi
        • 2 июня 2020 г. 19:16
        • (ред.)

        Внутри модели НИКАК

        Модель данных является более низким уровнем абстракции, чем такие пользовательские действия, как наведение курсора мыши.
        Модель данных ничего не знает о том, что происходит во View в данном случае.
        За наведение курсора мыши и т.д. отвечает делегат. Именно делегату делегируется визуальное оформление ячеек. Максимум стилевое оформление ячеек.

        Да, модели данных в Qt имеют некоторый функционал ролей, а также его можно расширить, если добавлять пользовательские роли.
        Но данные роли оформления зависят от данных в модели, но никак не от пользователя, который тыкает мышью во View.

        А это void Customers::on_tableView_entered(const QModelIndex &index) называется костыль.
        Сделать можно, но это неправильно. Особенно, если у вас будет хитрая кастомизация цвета.

        Из простого, можете попробовать поиграться по StyleSheet, что впрочем тоже не самый лучший выбор для таблиц.
        Что-то типо такого может заработать.

        1. tableView->setStyleSheet("::item:hover { color:rgb(0,0,255) }");
          МА
          • 2 июня 2020 г. 19:19

          как итог- получилось. Насчет костыль- или нет- это есть в сигнале студии, значит допустимо.

          1. void Customers::on_tableView_entered(const QModelIndex &index)
          2. {
          3. model->highlightRow(index);
          4. }

          И ваш вариант переопределенный data с небольшими изменениями

          1. QVariant TableModel::data(const QModelIndex &idx, int role) const
          2. {
          3. if(role == Qt::BackgroundColorRole && idx.row() == hiRow)
          4. return QColor(Qt::red);
          5.  
          6. if (role == Qt::BackgroundColorRole)
          7. {
          8. if (idx.row()%2 == 0){
          9. return QColor(Qt::lightGray);
          10. }
          11. else {
          12. return QColor(Qt::darkGray);
          13. }
          14. }
          15. else if (role == Qt::DisplayRole)
          16. {
          17. return QSqlTableModel::data(idx, role);
          18. }
          19.  
          20. return QSqlTableModel::data(idx, role);
          21. }
          22.  
          23. void TableModel::highlightRow(const QModelIndex &index)
          24. {
          25. hiRow = index.row();
          26. emit dataChanged(this->index(index.row(), 0), this->index(index.row(), 3));
          27. }

          Это работает!

            Evgenii Legotckoi
            • 2 июня 2020 г. 19:23

            Вы не поняли, это костыль с точки зрения архитектуры. В нормальном продакшене такое через ревью не пропускают. Но ваше право.

              МА
              • 2 июня 2020 г. 20:25

              Ок, соглашусь, что костыль.

              По делегату еще раз подсказать как тогда поступить лучше? По первой ссылке- не совсем то.

                Evgenii Legotckoi
                • 2 июня 2020 г. 20:27

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

                  МА
                  • 2 июня 2020 г. 20:40

                  Да, спасибо.

                    МА
                    • 3 июня 2020 г. 13:33

                    Забыли про меня вчера.

                      Evgenii Legotckoi
                      • 3 июня 2020 г. 13:34

                      Некогда было

                        Evgenii Legotckoi
                        • 4 июня 2020 г. 3:31
                        • Ответ был помечен как решение.
                          МА
                          • 4 июня 2020 г. 13:46

                          Спасибо.

                            Комментарии

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