Просмотр сообщений
|
Страниц: [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году похоже не пришли к однозначному результату 
|
|
|
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 реагировать на события мышки?
|
|
|
|
|