Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何检查应用程序是否已最小化_Qt_Qt5 - Fatal编程技术网

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

Qt 如何检查应用程序是否已最小化,qt,qt5,Qt,Qt5,每当应用程序窗口最小化或最大化时,我都希望将该信号与函数链接 这是代码 int main(int argc, char *argv[]) { QApplication application(argc, argv); Renderer w(model ); // This is QWidget w.show(); QObject::connect(&w, &QWindow::windowStateChanged, [&](Qt::Wind

每当应用程序窗口最小化或最大化时,我都希望将该信号与函数链接

这是代码

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,或者继承了QWindow。显然,您只能连接到类提供的信号。由于渲染器是一个QWidget,因此必须检查该类

告诉我们,没有改变的信号,但它表示:

当窗口状态更改时,小部件将接收类型为QEvent::WindowsStateChange的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
\ifndef渲染器\u H
#定义渲染器
#包括
#包括
类呈现器:公共QWidget{
Q_对象
信号:
无效状态已更改(布尔值最大化);
受保护的:
无效变更事件(QEvent*e)
{
如果(e->type()==QEvent::WindowsStateChange){
emit stateChanged(windowState()&~Qt::WindowMaximized);
}
QWidget::changevent(e);
}
};
#endif//u\H
intmain(intargc,char*argv[])
{
QApplication应用程序(argc、argv);
渲染器w;//这是QWidget
w、 show();
QObject::connect(&w,&Renderer::stateChanged,[&](布尔最大化){

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

至少,如果你有信号,你可以这样做。但是,你的连接表明
w
是一个QWindow,或者继承了一个QWindow。你显然只能连接到你的类提供的信号。因为你的渲染器是一个QWidget,你必须检查这个类

告诉我们,没有改变的信号,但它表示:

当窗口状态更改时,小部件将接收类型为QEvent::WindowsStateChange的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
\ifndef渲染器\u H
#定义渲染器
#包括
#包括
类呈现器:公共QWidget{
Q_对象
信号:
无效状态已更改(布尔值最大化);
受保护的:
无效变更事件(QEvent*e)
{
如果(e->type()==QEvent::WindowsStateChange){
emit stateChanged(windowState()&~Qt::WindowMaximized);
}
QWidget::changevent(e);
}
};
#endif//u\H
intmain(intargc,char*argv[])
{
QApplication应用程序(argc、argv);
渲染器w;//这是QWidget
w、 show();
QObject::connect(&w,&Renderer::stateChanged,[&](布尔最大化){

qDebug()我能够通过使用QApplication::focusWindow()解决这个问题

intmain(intargc,char*argv[])
{
QApplication应用程序(argc、argv);
渲染器w;//这是QWidget
w、 show();
QObject::connect(QApplication::focusWindow(),&Renderer::stateChanged,[&](布尔最大化){

qDebug()我能够通过使用QApplication::focusWindow()解决这个问题

intmain(intargc,char*argv[])
{
QApplication应用程序(argc、argv);
渲染器w;//这是QWidget
w、 show();
QObject::connect(QApplication::focusWindow(),&Renderer::stateChanged,[&](布尔最大化){

qDebug()代码不会编译,因为w是QWidget,即使我将其强制转换为QWindow,QWindow wndQT=(QWindow)w.window();并在Connect中使用它,但lambda不会执行。@Summit我明白了。您暗示在Connect中使用窗口,但在渲染器中使用QWidget。我更新了我的答案,请检查:)我建议您了解一些基本知识,如何进行强制转换以及它是什么。您只能将变量强制转换为该值实际代表的类型。否则您会遇到问题。请这样想:告诉计算机您的柠檬是苹果会让计算机认为它是苹果,但它不会因此尝起来甜代码不会编译,因为w是QWidget,即使我将其强制转换为QWindow,QWindow wndQT=(QWindow)w.window();并在Connect中使用它,但lambda不会执行。@我明白了。您暗示在Connect中使用窗口,但在渲染器中使用QWidget。我更新了我的答案,请检查:)我建议您了解一些基本知识,如何进行强制转换以及它是什么。您只能将变量强制转换为实际值所代表的类型。否则您会遇到问题。请这样想:告诉计算机您的柠檬是苹果会让计算机认为它是苹果,但它不会因此尝起来甜。是吗您确定这正在工作并编译代码吗?
QApplication::focusWindow()
将返回一个
QWindow*
,您既不能获取它的右值(使用
&
),也不能继承
呈现程序
。connect函数需要一个QWindow*,这就是QApplication::focusWindow()给出。
QApplication::focusWindow()
给出了一个指针,这是正确的,但是您可以通过添加
&
引用所述指针。此外,QWindow不继承呈现程序,因此由
focusWindow()返回的窗口
不会提供
渲染器::stateChanged
。这对我来说很奇怪,但如果你说它有效,我必须相信你的-我尝试了你的确切代码,但由于声明的原因未能使用clang进行编译。虽然很好,但这将解决一个问题。QWindow仍然不是渲染器。你可以使用你的原始设计但是,连接到
&QWindow::windowstate已更改
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();
}