Как проверить, свернуто ли приложение - PullRequest
0 голосов
/ 18 июня 2020

Каждый раз, когда окно приложения минимизируется или разворачивается, я хочу связать этот сигнал с функцией.

Это код.

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: : функция подключения?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Вы не можете использовать функцию connect для подключения к разным слотам на основе заданного значения. Однако вы можете просто вызвать функции на основе значения, проверив значение в лямбде.

По крайней мере, вы могли бы, если бы у вас был сигнал. Однако ваше соединение предполагает, что w является - или наследует - QWindow. Очевидно, вы можете подключаться только к сигналам, предоставляемым вашим классом. Поскольку ваш Renderer является QWidget, вы должны проверить этот класс.

Документация QWidget сообщает нам, что сигнала windowStateChanged нет, но в нем указано:

Когда состояние окна изменяется, виджет получает changeEvent () типа 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();
}
0 голосов
/ 19 июня 2020

Мне удалось решить с помощью 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();
}
...