【问题标题】:How to check if the application has been minimized如何检查应用程序是否已最小化
【发布时间】:2020-06-18 09:25:00
【问题描述】:

每当应用程序窗口被最小化或最大化时,我都想将该信号与一个函数联系起来。

这是代码。

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 函数的参数是什么?

【问题讨论】:

    标签: qt qt5


    【解决方案1】:

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

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

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

    当窗口状态改变时,小部件会收到一个 QEvent::WindowStateChange 类型的 changeEvent()。

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

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

    【讨论】:

    • 代码不会编译,因为 w 是 QWidget ,即使我将它转换为 QWindow , QWindow wndQT = (QWindow)w.window();
    • 并在 Connect 中使用它而不是 lambda 不执行。
    • @Summit 我明白了。您暗示在连接中使用 Window,但使用 QWidget 进行渲染。我更新了我的答案,看看:)
    • 我建议您了解一些基础知识、投射的工作原理以及它是什么。您只能将变量转换为该值实际代表的类型。否则你会遇到问题。可以这样想:告诉计算机你的柠檬是苹果会让计算机认为它是苹果,但它不会因此尝起来甜。
    【解决方案2】:

    我可以通过使用 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();
    }
    

    【讨论】:

    • 你确定这是工作和编译代码吗? QApplication::focusWindow() 将返回一个QWindow*,您既不能取其右值(使用&amp;),QWindow 也不能继承Renderer
    • connect 函数需要一个 QWIndow*,这是 QApplication::focusWindow() 提供的。
    • QApplication::focusWindow()给出了一个指针,这是正确的,但是你可以通过添加&amp;来引用该指针。另外,QWindow 不继承 Renderer,所以focusWindow() 返回的窗口不会提供Renderer::stateChanged。这对我来说看起来很奇怪,但如果你说它有效,我必须接受你的支持 - 我尝试了你的确切代码,但由于上述原因未能使用 clang 编译
    • 很好,这将解决一个问题。您仍然留下 QWindow 不是渲染器。不过,您可以使用您的原始设计,连接到&amp;QWindow::windowStateChanged。但是请注意,focusWindow() 不是您的 Renderer 实例 w。生成的 QWindow 是当前焦点视图的基础。虽然这可能适用于您的目的,但如果您尝试将 changeSignal 的发送者作为 Renderer 访问,则会遇到问题。此外,如果 focusWindow 发生变化(例如,如果您有多个窗口),您的信号将不会重新连接,这可能会让其他人感到困惑。
    • @T3 H40 感谢您的 cmets,我能够理解当前方法可能面临的问题,但我的应用程序中只有一个寡妇,它适用于我的目的。
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多