c++ - 在 Qt 中集中跟踪打开和关闭的窗口

标签 c++ qt window

我需要 QApplication 中的一些虚函数/信号/事件来集中通知应用程序中任何打开和关闭的窗口(提供指向窗口对象的指针;包括基于 QMainWindow、QDialog、QWidget 的窗口)。

这应该可以手动注册所有窗口实例并且无需手动操作每个实例(例如,通过在每个窗口对象上安装事件过滤器或连接)。 此外,也没有必要从某些接口(interface)类或类似类中对跟踪窗口进行子类化。

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

最佳答案

必须覆盖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);
    }
};

关于c++ - 在 Qt 中集中跟踪打开和关闭的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55464811/

相关文章:

c++ - C++中具有概率分布的 vector 的随机生成器

c++ - Winsock c++,程序在连接到离线服务器时卡住

c++ - std::set<string> 和内存

c++ - 如何以这种特定方式读取和处理文件中的文本?

qt - 奇怪的 alpha 混合结果与 ShaderEffectItem

c++ - 未绘制 QToolButton 上的文本

Javascript 在窗口/选项卡关闭之前注册窗口/选项卡关闭事件

c++ - 为什么 QTreeView 不显示数据?

javafx - JavaFX窗口setTitle

winapi - 使用 GL_RGBA 颜色缓冲区设置 Win32 OpenGL 窗口