如何检查应用程序是否已最小化

How to check if the application has been minimized

每当应用程序 window 被最小化或最大化时,我想 link 那个带有函数的信号。

这是代码。

int main(int argc, char *argv[])
{
    QApplication application(argc, argv);
    Renderer w(model ); // This is  QWidget
    w.show();
    QObject::connect(&w, &QWindow::windowStateChanged, [&](Qt::WindowState state) {
        });

        // how will i define the QObject::connect 
    return application.exec();
}

QObject::connect 函数的参数是什么?

您不能使用 connect 函数根据给定值连接到不同的插槽。但是,您可以通过检查 lambda 中的值来简单地根据值调用函数。

至少,如果你有信号,你可以。但是,您的连接表明 w 是 - 或继承 - QWindow。您显然只能连接到 class 提供的信号。由于您的渲染器是 QWidget,因此您必须检查 class.

documentation of QWidget 告诉我们,没有 windowStateChanged 信号,但它指出:

When the window state changes, the widget receives a changeEvent() of type QEvent::WindowStateChange.

因此我们可以创建自己的信号并连接到它。这看起来类似于以下工作示例:

#ifndef RENDERER_H
#define RENDERER_H

#include <QWidget>
#include <QEvent>

class Renderer : public QWidget {
    Q_OBJECT

signals:
    void stateChanged(bool isMaximized);

protected:
    void changeEvent(QEvent *e)
    {
        if(e->type() == QEvent::WindowStateChange) {
            emit stateChanged(windowState() & ~Qt::WindowMaximized);
        }
        QWidget::changeEvent(e);
    }
};

#endif  // RENDERER_H
int main(int argc, char *argv[])
{
    QApplication application(argc, argv);
    Renderer w; // This is  QWidget
    w.show();
    QObject::connect(&w, &Renderer::stateChanged, [&](bool maximized) {
        qDebug() << "Maximized?" << maximized;
    });
    return application.exec();
}

我可以使用 QApplication::focusWindow()

来解决
int main(int argc, char *argv[])
{
    QApplication application(argc, argv);
    Renderer w; // This is  QWidget
    w.show();
    QObject::connect(QApplication::focusWindow(), &Renderer::stateChanged, [&](bool maximized) {
        qDebug() << "Maximized?" << maximized;
    });
    return application.exec();
}