我正在用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()));当窗口关闭时,下面的插槽应该被触发,但它永远不会被触发。当我使用而不是手动处理事件时,它会触发。
void QTEngine::windowClosed() {
terminate_loop = true;
}经进一步调查,Qt文档如下:
当关闭最后一个可见主窗口(即没有父窗口的窗口)时,从exec()发出lastWindowClosed。
因为我不使用exec(),所以没有发出这个信号。当QWindow关闭时,还有其他方法来检测吗?
发布于 2015-03-27 15:41:25
您可能应该使用Qt内部事件循环来设计游戏应用程序。Qt提供的"OpenGL窗口“示例展示了一个很好的呈现循环示例。
但是,可以在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);
}
};要将事件筛选器附加到窗口,只需使用由任何installEventFilter子类(包括QWindow )实现的QObject ()函数即可。
QGuiApplication *app = new QGuiApplication(argc,argv);
QWindow* window = new QWindow();
CloseEventFilter *closeFilter = new CloseEventFilter(window);
window->installEventFilter(closeFilter);
...发布于 2021-08-19 22:37:33
我的QQuickItem是这样做的
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。
发布于 2014-02-08 07:38:50
我能想出两种可能的解决方案。我没有测试任何一种解决方案。
1)可以使用QWindow标志创建Qt::WA_DeleteOnClose。这样做是在窗口关闭时删除对象。任何被删除的QObject都会发出destroyed()信号,这意味着您应该能够将destroyed()信号连接到您的插槽。
2)您还可以重新实现您的QWidget::closeEvent()处理程序的QWindow,并发出您自己的自定义信号。
https://stackoverflow.com/questions/21642943
复制相似问题