МА
Михаил АJune 1, 2020, 2:12 p.m.

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

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

13
IscanderChe
  • June 1, 2020, 2:33 p.m.

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

    Evgenii Legotckoi
    • June 2, 2020, 3:03 a.m.

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

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

      МА
      • June 2, 2020, 9:03 a.m.

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

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

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

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

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

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

        Evgenii Legotckoi
        • June 2, 2020, 9:16 a.m.
        • (edited)

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

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

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

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

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

        tableView->setStyleSheet("::item:hover { color:rgb(0,0,255) }");
        
          МА
          • June 2, 2020, 9:19 a.m.

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

          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
            • June 2, 2020, 9:23 a.m.

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

              МА
              • June 2, 2020, 10:25 a.m.

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

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

                Evgenii Legotckoi
                • June 2, 2020, 10:27 a.m.

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

                  МА
                  • June 2, 2020, 10:40 a.m.

                  Да, спасибо.

                    МА
                    • June 3, 2020, 3:33 a.m.

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

                      Evgenii Legotckoi
                      • June 3, 2020, 3:34 a.m.

                      Некогда было

                        Evgenii Legotckoi
                        • June 3, 2020, 5:31 p.m.
                        • The answer was marked as a solution.

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

                          МА
                          • June 4, 2020, 3:46 a.m.

                          Спасибо.

                            Comments

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

                            C ++ - Test 004. Pointers, Arrays and Loops

                            • Result:50points,
                            • Rating points-4
                            m

                            C ++ - Test 004. Pointers, Arrays and Loops

                            • Result:80points,
                            • Rating points4
                            m

                            C ++ - Test 004. Pointers, Arrays and Loops

                            • Result:20points,
                            • Rating points-10
                            Last comments
                            ИМ
                            Игорь МаксимовNov. 22, 2024, 11:51 a.m.
                            Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                            Evgenii Legotckoi
                            Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                            Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                            A
                            ALO1ZEOct. 19, 2024, 8:19 a.m.
                            Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                            ИМ
                            Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                            Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                            d
                            dblas5July 5, 2024, 11:02 a.m.
                            QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                            Now discuss on the forum
                            Evgenii Legotckoi
                            Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                            t
                            tonypeachey1Nov. 15, 2024, 6:04 a.m.
                            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                            NSProject
                            NSProjectJune 4, 2022, 3:49 a.m.
                            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                            9
                            9AnonimOct. 25, 2024, 9:10 a.m.
                            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                            Follow us in social networks