Централизованно отслеживать открытые и закрытые окна в Qt - PullRequest
1 голос
/ 02 апреля 2019

Мне нужна некоторая виртуальная функция / сигнал / событие в приложении QApplication, которое централизованно информирует о любом открытом и закрытом окне в приложении (предоставляя указатель на объект окна; включая окна на основе QMainWindow, QDialog, QWidget).

Это должно работать без регистрации всех экземпляров окна вручную и без манипулирования каждым экземпляром вручную (например, путем установки фильтров событий или соединений на каждом объекте окна).Также не должно быть необходимости подразделять отслеживаемые окна от некоторого класса интерфейса или подобного.

Итак, каков наилучший способ в Qt отследить все открытые и закрытые окна в приложении?

1 Ответ

1 голос
/ 02 апреля 2019

Вы должны перезаписать метод уведомления QApplication (или QGuiApplication):

#include <QtWidgets>

class Application: public QApplication
{
public:
    using QApplication::QApplication;
    bool notify(QObject *receiver, QEvent *e) override
    {
        if(receiver->isWindowType()){
            if(e->type() == QEvent::Show){
                qDebug()<< receiver << "show";
            }
            else if (e->type() == QEvent::Close) {
                qDebug()<< receiver << "close";
            }
        }
        return QApplication::notify(receiver, e);
    }
};

int main(int argc, char *argv[])
{
    Application a(argc, argv);
    QMainWindow m;
    QDialog d;
    QWidget w;
    m.show();
    d.show();
    w.show();
    return a.exec();
}

Обновление:

#include <QtWidgets>

class Application: public QApplication
{
public:
    using QApplication::QApplication;
    bool notify(QObject *receiver, QEvent *e) override
    {
        if(receiver->isWidgetType()){
            QWidget *w = qobject_cast<QWidget *>(receiver);
            if(w->isWindow()){
                if(e->type() == QEvent::Show){
                    qDebug()<< w << "show";
                }
                else if (e->type() == QEvent::Close) {
                     qDebug()<< w << "close";
                }
            }
        }
        return QApplication::notify(receiver, e);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...