МА
Михаил АМаусым 1, 2020, 2:12 Т.Қ.

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

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

13
IscanderChe
  • Маусым 1, 2020, 2: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, 5:31 Т.Қ.
                        • Жауап шешім ретінде белгіленді.

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

                          МА
                          • Маусым 4, 2020, 3:46 Т.Ж.

                          Спасибо.

                            Пікірлер

                            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                            Кіріңіз немесе Тіркеліңіз
                            Г

                            C++ - Тест 001. Первая программа и типы данных

                            • Нәтиже:66ұпай,
                            • Бағалау ұпайлары-1
                            t

                            C++ - Тест 001. Первая программа и типы данных

                            • Нәтиже:33ұпай,
                            • Бағалау ұпайлары-10
                            t

                            Qt - Тест 001. Сигналы и слоты

                            • Нәтиже:52ұпай,
                            • Бағалау ұпайлары-4
                            Соңғы пікірлер
                            G
                            GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                            d
                            dblas5Шілде 5, 2024, 11:02 Т.Ж.
                            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                            k
                            kmssrАқп. 8, 2024, 6:43 Т.Қ.
                            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                            АК
                            Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                            Енді форумда талқылаңыз
                            Evgenii Legotckoi
                            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                            F
                            FynjyШілде 22, 2024, 4:15 Т.Ж.
                            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                            BlinCT
                            BlinCTМаусым 25, 2024, 1 Т.Ж.
                            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                            BlinCT
                            BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                            Evgenii Legotckoi
                            Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                            Бізді әлеуметтік желілерде бақылаңыз