У меня возникла проблема, когда мое приложение Qt quick заблокировалось после открытия 25 ApplicationWindows.Я понятия не имею, почему, поэтому я написал это простое тестовое приложение, чтобы воспроизвести проблему.Он начинается с создания окна с кнопкой и нажатием этой кнопки создает другое окно.Окно, которое оно создает, имеет кнопку для вызова другого окна с кнопкой, это будет происходить бесконечно.Однако приложение блокируется после того, как я попал ровно в 24 подменю (всего 25, включая первое созданное окно).Без сбоев, без ошибок, просто перестает реагировать на щелчки мыши.Память и другие ресурсы, кажется, в порядке.Так почему мы запираемся?Есть ли в Qt ограничение на количество открытых окон приложений?Iv никогда не слышал об одном.Я нарушаю лимит в Windows, где программа может порождать столько окон?Я очень сомневаюсь, что это так.Я изучал это некоторое время без веской причины, по которой он зависает.Любой совет будет принята с благодарностью.
Main.cpp
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "MenuManager.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute( Qt::AA_UseOpenGLES );
QApplication app( argc, argv );
QQmlApplicationEngine engine;
MenuManager* menuManager = new MenuManager( &engine );
engine.rootContext()->setContextProperty( "menuManager", menuManager );
engine.load( QUrl(QStringLiteral( "qrc:/main.qml" ) ) );
if ( engine.rootObjects().isEmpty() )
return -1;
return app.exec();
delete menuManager;
}
MenuManager.h
#pragma once
#include <QQmlApplicationEngine>
#include <QObject>
class MenuManager :
public QObject
{
public:
explicit MenuManager( QQmlApplicationEngine* engine );
public slots:
void openSubMenu();
private:
Q_OBJECT
QQmlApplicationEngine* engine;
};
MenuManager.cpp
#include <QQuickItem>
#include <QWindow>
#include "MenuManager.h"
MenuManager::MenuManager( QQmlApplicationEngine* engine ) :
engine{ engine }
{
}
void MenuManager::openSubMenu()
{
QWindow* createdComponent = nullptr;
QQmlComponent component( engine, QUrl( QString( "qrc:///Menu.qml" ) ),
QQmlComponent::PreferSynchronous );
if ( component.status() == QQmlComponent::Ready )
createdComponent = qobject_cast< QWindow* >( component.create() );
}
main.qml
import QtQuick.Window 2.2
import QtQuick.Controls 2.0
ApplicationWindow
{
id: mainWindow
title: qsTr( "Test" )
visible: true
x: 100
y: 100
width: 200
height: 200
Button
{
text: "TopLevelMenu"
onClicked: menuManager.openSubMenu();
}
}
Menu.qml
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
ApplicationWindow
{
id: menu
visible: true
x: 100
y: 100
width: 200
height: 200
Button
{
onClicked: menuManager.openSubMenu()
text: "SubMenu"
}
}