gpt4 book ai didi

c++ - Qt - 检测 QWindow 何时关闭

转载 作者:太空狗 更新时间:2023-10-29 21:21:56 26 4
gpt4 key购买 nike

我正在使用 Qt 制作游戏,并且正在制作自定义游戏循环,以便我可以精确控制逻辑时间步长并以最大帧速率进行渲染。

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

...
QGuiApplication app(argc,argv);
QWindow* window = new QWindow();
window.show();
app.exec();
...

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

不过,我是按以下方式做的:

QGuiApplication *app = new QGuiApplication(argc,argv);
QWindow* window = new QWindow();
window.show();
while (!terminate_loop) {
app->processEvents();
GameUpdate();
GameRender();
}
app->exit();

但是,当窗口关闭时,我的循环仍在继续。我需要检测窗口何时关闭,以便我的循环可以终止。我尝试了以下方法以捕获窗口何时关闭:

connect(app,SIGNAL(lastWindowClosed()),this,SLOT(windowClosed()));

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

void QTEngine::windowClosed() {
terminate_loop = true;
}

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

[lastWindowClosed] is emitted from exec() when the last visible primary window (i.e. window with no parent) is closed.

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

最佳答案

您或许应该使用 Qt 内部事件循环来设计您的游戏应用程序。 "OpenGL Window" example Qt 提供了一个很好的渲染循环示例。

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

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

};

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

QGuiApplication *app = new QGuiApplication(argc,argv);
QWindow* window = new QWindow();
CloseEventFilter *closeFilter = new CloseEventFilter(window);
window->installEventFilter(closeFilter);
...

关于c++ - Qt - 检测 QWindow 何时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21642943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com