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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / отследить закрытие окна(приложения) с убранной рамкой : Март 29, 2021, 20:45
извиняюсь за много букв ниже.

отслеживание закрытия окна(приложения) не работает (у меня) когда убираю рамку окна..

есть дефолтное MainWindow w; со скрытой рамкой
        w.setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);

окно закрываю на тулбаре
        QToolBar *toolbar=new QToolBar("main toolbar");
        QAction *quit = toolbar->addAction(QIcon(quitpix), "Quit Application");
        QObject::connect(quit, &QAction::triggered, qApp, &QApplication::quit);
        w.addToolBar(Qt::TopToolBarArea,toolbar);

при закрытии окна(завершении приложения) выполняю какое-то действие
(а именно запись неких данных в QSettings функцией writeLog() ) из кастомного
класса.

отслеживаю закрытие окна(приложения) так:

вариант 1:
class customClass{
...  
writeLog();//записываю лог в файл
...
// связываю экшн тулбара так-же с моим слотом записи лога
QObject::connect(quit, &QAction::triggered, qApp, &QApplication::quit);
QObject::connect(quit, &QAction::triggered, this, &сustomClass::WriteLogSlot);//не работает
 ...
public slots:
void writeLogSlot(){
   writeLog();
}

вариант2:
в том же кастомном классе
QObject::connect(qApp,  &QApplication::destroyed,    this, &customClass::WriteLogSlot);
или
QObject::connect( qApp, &QApplication::aboutToQuit, this, &customClass::WriteLogSlot);
то же не работает

вариант3:
работает только если закрываю окно кнопкой [х]
в MainWindow класс кидаю signal: WriteLogSignal()
и  связываю со слотом кастомного класса
QObject::connect( &w, &MainWindow::WriteLogSignal,
                           this, &customClass::WriteLogSlot);
определяю CloseEvent в MainWindow:
protected:
    void closeEvent(QCloseEvent *event){
       // event->ignore();
    emit WriteLogSignal();
       // event->accept();
}

вариант4:
не работает
        ....
        w->installEventFilter(this);
        ...
 protected:
            bool eventFilter(QObject *obj, QEvent *event)
            {
                if (obj ==  w) {
                     QEvent::Type type = event->type();
                     if  (type == QEvent::Quit) {
                         writeLog();
                     }
                 }
              return QWidget::eventFilter(obj, event);
}

upd впрочем я неверно выразился, CloseEvent для MainWindow срабатывает если
закрыть окно нажав на |x|  а если вызываю слот QApplication::quit то нет
2  Qt / QSS / 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



3  Qt / QSS / 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году
похоже не пришли к однозначному результату В замешательстве
4  Qt / Пользовательский интерфейс (GUI) / Перенесено: реакция QGroupBox на hover : Март 02, 2021, 17:33
Тема перенесена в QSS.

http://www.prog.org.ru/topic_32966_0.html
5  Qt / QSS / реакция 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 реагировать на события мышки?






Страниц: [1]

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