МА
Михаил А1 июня 2020 г. 14:12

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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

13
IscanderChe
  • 1 июня 2020 г. 14:33

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        tableView->setStyleSheet("::item:hover { color:rgb(0,0,255) }");
        
          МА
          • 2 июня 2020 г. 9: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
            • 2 июня 2020 г. 9:23

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

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

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

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

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

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

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

                  Да, спасибо.

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

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

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

                      Некогда было

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

                        Можете теперь посмотреть в этой статье Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

                          МА
                          • 4 июня 2020 г. 3:46

                          Спасибо.

                            Комментарии

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

                            C++ - Тест 004. Указатели, Массивы и Циклы

                            • Результат:50баллов,
                            • Очки рейтинга-4
                            m
                            • molni99
                            • 26 октября 2024 г. 11:37

                            C++ - Тест 004. Указатели, Массивы и Циклы

                            • Результат:80баллов,
                            • Очки рейтинга4
                            m
                            • molni99
                            • 26 октября 2024 г. 11:29

                            C++ - Тест 004. Указатели, Массивы и Циклы

                            • Результат:20баллов,
                            • Очки рейтинга-10
                            Последние комментарии
                            ИМ
                            Игорь Максимов22 ноября 2024 г. 22:51
                            Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                            Evgenii Legotckoi
                            Evgenii Legotckoi1 ноября 2024 г. 0:37
                            Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                            A
                            ALO1ZE19 октября 2024 г. 18:19
                            Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                            ИМ
                            Игорь Максимов5 октября 2024 г. 17:51
                            Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                            d
                            dblas55 июля 2024 г. 21:02
                            QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                            Сейчас обсуждают на форуме
                            Evgenii Legotckoi
                            Evgenii Legotckoi25 июня 2024 г. 1:11
                            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                            t
                            tonypeachey115 ноября 2024 г. 17:04
                            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                            NSProject
                            NSProject4 июня 2022 г. 13:49
                            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                            9
                            9Anonim25 октября 2024 г. 19:10
                            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                            Следите за нами в социальных сетях