Russian Qt Forum

Qt => QSS => Тема начата: Вольдемар от Март 02, 2021, 17:13



Название: реакция QGroupBox на hover
Отправлено: Вольдемар от Март 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 реагировать на события мышки?








Название: Re: реакция QGroupBox на hover
Отправлено: kambala от Март 02, 2021, 19:32
можно например через фильтр событий: https://doc.qt.io/qt-5/eventsandfilters.html#event-filters

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


Название: Re: реакция QGroupBox на hover
Отправлено: Вольдемар от Март 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году
похоже не пришли к однозначному результату :-\


Название: Re: реакция QGroupBox на hover
Отправлено: Вольдемар от Март 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