МА
02 червня 2020 р. 00:12

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

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

3

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

13
IscanderChe
  • 02 червня 2020 р. 00:33

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

    Evgenii Legotckoi
    • 02 червня 2020 р. 13:03

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

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

      МА
      • 02 червня 2020 р. 19:03

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

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

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

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

      void Customers::on_tableView_entered(const QModelIndex &index)
      {
      
      }
      

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

        Evgenii Legotckoi
        • 02 червня 2020 р. 19:16
        • (відредаговано)

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

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

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

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

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

        tableView->setStyleSheet("::item:hover { color:rgb(0,0,255) }");
        
          МА
          • 02 червня 2020 р. 19:19

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

          void Customers::on_tableView_entered(const QModelIndex &index)
          {
              model->highlightRow(index);
          }
          

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

          QVariant TableModel::data(const QModelIndex &idx, int role) const
          {
              if(role == Qt::BackgroundColorRole && idx.row() == hiRow)
                    return QColor(Qt::red);
          
              if (role == Qt::BackgroundColorRole)
              {
                  if (idx.row()%2 == 0){
                      return QColor(Qt::lightGray);
                  }
                  else {
                      return QColor(Qt::darkGray);
                  }
              }
              else if (role == Qt::DisplayRole)
              {
                  return QSqlTableModel::data(idx, role);
              }
          
              return QSqlTableModel::data(idx, role);
          }
          
          void TableModel::highlightRow(const QModelIndex &index)
          {
              hiRow = index.row();
              emit dataChanged(this->index(index.row(), 0), this->index(index.row(), 3));
          }
          

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

            Evgenii Legotckoi
            • 02 червня 2020 р. 19:23

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

              МА
              • 02 червня 2020 р. 20:25

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

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

                Evgenii Legotckoi
                • 02 червня 2020 р. 20:27

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

                  МА
                  • 02 червня 2020 р. 20:40

                  Да, спасибо.

                    МА
                    • 03 червня 2020 р. 13:33

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

                      Evgenii Legotckoi
                      • 03 червня 2020 р. 13:34

                      Некогда было

                        Evgenii Legotckoi
                        • 04 червня 2020 р. 03:31
                        • Відповідь була позначена як рішення.
                          МА
                          • 04 червня 2020 р. 13:46

                          Спасибо.

                            Коментарі

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