Russian Qt Forum
Март 28, 2024, 16:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: реакция QGroupBox на hover  (Прочитано 22172 раз)
Вольдемар
Новичок

Offline Offline

Сообщений: 4


Просмотр профиля
« : Март 02, 2021, 17:13 »

прошу прощения я новичек на форуме и несразу увидел ветку QSS, перенес вопрос сюда.

Есть некий QGroupBox, нужно изменить, скажем, его border при наведении мышкой.
пытаюсь прописать стили

    auto g=new QGroupBox(&mainWindow);    
    g->setFixedSize(300,300);
    g->setObjectName("g");
    g->setStyleSheet("QGroupBox#g{"
                     "border: 2px solid green;"
                     "}"
                     "QGroupBox#g:hover{"
                     "border: 2px solid yellow;"
                     "}"  );
и ничего не происходит.
Перерыв кучу гайдов, ненашол ответа.

Включил чекбокс в области тайтла групбокса   g->setCheckable(true);
теперь стили работают,  но лишь при наведении на этот самый чекбокс.

(кстати сигнал вида
QObject::connect(g, &QGroupBox::clicked,
                     [=]()mutable{
                                   g->setFixedSize(100,100);
                      });
работает так же лишь на чекбокс...)

Как мне заставить всю область GroupBox реагировать на события мышки?






« Последнее редактирование: Март 02, 2021, 17:38 от Вольдемар » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4724



Просмотр профиля WWW
« Ответ #1 : Март 02, 2021, 19:32 »

можно например через фильтр событий: https://doc.qt.io/qt-5/eventsandfilters.html#event-filters

по-моему тебе стиль надо применять (в смысле вызывать метод setStyleSheet) не к g, а к его родителю — mainWindow
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Вольдемар
Новичок

Offline Offline

Сообщений: 4


Просмотр профиля
« Ответ #2 : Март 02, 2021, 20:03 »

к паренту попробовал применять-ровно то же самое.
еще так пробовал
void QGroupBox::mousePressEvent(QMouseEvent *event)
 {
     if (event->button() == Qt::LeftButton)
     {
         setStyleSheet("QGroupBox{"
                                     "border: 2px solid yellow;"
                               "}"   );
     } else {
         QGroupBox::mousePressEvent(event);
     }
 }
то же ничего не дает...

буду смотреть фильтры событий спс за подсказку, однако я блин непонимаю
зачем так обидели QGroupBox ведь можно было QGroupBox:hover => ховер на
весь виджет, и QGroupBox::indicator:hover или ::title:hover для этих деталей кому надо.. Непонимающий Непонимающий

зы вот http://www.prog.org.ru/topic_23227_15.html практически аналогичное обсуждение в 2012году
похоже не пришли к однозначному результату В замешательстве
« Последнее редактирование: Март 02, 2021, 20:11 от Вольдемар » Записан
Вольдемар
Новичок

Offline Offline

Сообщений: 4


Просмотр профиля
« Ответ #3 : Март 03, 2021, 12:33 »

  С фильтром событий все решилось, спс kambala за наводку.
  Странно что нельзя реализовать hover, pressed и тп
стилями(или сигналами) для таких виджетов как QGroupBox, QFrame...

  Вот черновик, все в класс окна влепил тестово, может кому пригодится
(обр. внимание-стили, которые вы не изменяете при обработке событий, все равно прописываем, иначе они скинутся к дефолтным)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QEvent>
#include <QGroupBox>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0){
        g->setParent(this);
        g->setObjectName("g");
        g->setFixedSize(200,200);
        g->setStyleSheet("QGroupBox#g{"
                         "border: 2px solid gray;"
                         "background: green;"
                         "}");
        g->installEventFilter(this);
    }
    ~MainWindow();

    QGroupBox *g=new QGroupBox;

protected:
    bool eventFilter(QObject *obj, QEvent *event)
    {
        if (obj ==  g) {
              QEvent::Type type = event->type();
              if  (type == QEvent::HoverLeave) {
                  g->setStyleSheet("QGroupBox#g{"
                                   "border: 2px solid gray;"
                                   "background: green;"
                                   "}");

              } else if (type == QEvent::HoverEnter) {
                  g->setStyleSheet("QGroupBox#g{"
                                   "border: 2px solid yellow;"
                                   "background: green;"
                                   "}");

              }else if (type == QEvent::MouseButtonPress) {
                 g->setStyleSheet("QGroupBox#g{"
                                   "border: 2px solid yellow;"
                                   "background: red;"
              }
          }
          return QWidget::eventFilter(obj, event);
    }
};
#endif // MAINWINDOW_H



« Последнее редактирование: Март 03, 2021, 12:38 от Вольдемар » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.