在 Qt 中集中跟踪打开和关闭 windows

Centrally track opened and closed windows in Qt

我需要 QApplication 中的一些虚拟 function/signal/event 集中通知应用程序中任何打开和关闭的 window(提供指向 window 对象的指针;包括 QMainWindow、QDialog , 基于 QWidget windows)。

这应该 无需 手动注册所有 window 实例并且无需手动操作每个实例(例如,通过在每个 window 对象上安装事件过滤器或连接). 此外,也没有必要从某些界面 class 或类似界面 class 跟踪 windows。

那么,在 Qt 中跟踪应用程序中所有已打开和已关闭 windows 的最佳方法是什么?

必须覆盖QApplication(或QGuiApplication)的notify方法:

#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);
    }
};