我需要 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/