首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt -当QWindow关闭时检测

Qt -当QWindow关闭时检测
EN

Stack Overflow用户
提问于 2014-02-08 06:42:49
回答 3查看 4K关注 0票数 3

我正在用Qt制作一个游戏,我正在制作一个自定义的游戏循环,这样我就可以精确地控制逻辑时间步骤并以最大帧速率呈现。

通常,要创建一个QWindow,您可以这样做:

代码语言:javascript
复制
...
QGuiApplication app(argc,argv);
QWindow* window = new QWindow();
window.show();
app.exec();
...

当窗口关闭时,exec()会返回。

然而,我是这样做的:

代码语言:javascript
复制
QGuiApplication *app = new QGuiApplication(argc,argv);
     QWindow* window = new QWindow();
     window.show();
     while (!terminate_loop) {
          app->processEvents();
          GameUpdate();
          GameRender();
     }
     app->exit();

然而,当窗口关闭时,我的循环继续进行。我需要检测窗口何时关闭,这样我的循环就可以终止。为了捕捉窗口关闭后的情况,我尝试了以下方法:

代码语言:javascript
复制
connect(app,SIGNAL(lastWindowClosed()),this,SLOT(windowClosed()));

当窗口关闭时,下面的插槽应该被触发,但它永远不会被触发。当我使用而不是手动处理事件时,它会触发

代码语言:javascript
复制
void QTEngine::windowClosed() {
    terminate_loop = true;
}

经进一步调查,Qt文档如下:

当关闭最后一个可见主窗口(即没有父窗口的窗口)时,从exec()发出lastWindowClosed。

因为我不使用exec(),所以没有发出这个信号。当QWindow关闭时,还有其他方法来检测吗?

EN

回答 3

Stack Overflow用户

发布于 2015-03-27 15:41:25

您可能应该使用Qt内部事件循环来设计游戏应用程序。Qt提供的"OpenGL窗口“示例展示了一个很好的呈现循环示例。

但是,可以在QWindow上获得关闭事件。在5.4.1版本中,不提供方便的closeEvent()函数。但是,您可以在QWindow上安装事件筛选器对象并获取关闭事件。以下是此类事件筛选器对象实现的示例:

代码语言:javascript
复制
class CloseEventFilter : public QObject
{
     Q_OBJECT
public:
     CloseEventFilter(QObject *parent) : QObject(parent) {}

protected: 
     bool eventFilter(QObject *obj, QEvent *event)
     {
          if (event->type() == QEvent::Close)
          { 
               // Do something interesting, emit a signal for instance.
          }

          return QObject::eventFilter(obj, event);
     }

};

要将事件筛选器附加到窗口,只需使用由任何installEventFilter子类(包括QWindow )实现的QObject ()函数即可。

代码语言:javascript
复制
QGuiApplication *app = new QGuiApplication(argc,argv);
QWindow* window = new QWindow();
CloseEventFilter *closeFilter = new CloseEventFilter(window);
window->installEventFilter(closeFilter);
...
票数 4
EN

Stack Overflow用户

发布于 2021-08-19 22:37:33

我的QQuickItem是这样做的

代码语言:javascript
复制
  connect(
    this,
    &QQuickItem::windowChanged,
    this,
    [this](QQuickWindow* const w)
    {
      if (w)
      {
        connect(
          w,
          &QWindow::visibleChanged,
          this,
          [this](bool const v)
          {
            if (!v)
            {
              // window closing
            }
          }
        );
      }
    },
    Qt::DirectConnection
  );

close()可以隐藏您的窗口,也可以破坏它。根据它的功能,您需要连接到&QWindow::visibleChanged&QObject::destroyed

票数 0
EN

Stack Overflow用户

发布于 2014-02-08 07:38:50

我能想出两种可能的解决方案。我没有测试任何一种解决方案。

1)可以使用QWindow标志创建Qt::WA_DeleteOnClose。这样做是在窗口关闭时删除对象。任何被删除的QObject都会发出destroyed()信号,这意味着您应该能够将destroyed()信号连接到您的插槽。

2)您还可以重新实现您的QWidget::closeEvent()处理程序的QWindow,并发出您自己的自定义信号。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21642943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档