Приложение Qt Quick блокируется при создании 25 окон приложения - PullRequest
0 голосов
/ 02 октября 2018

У меня возникла проблема, когда мое приложение 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"
   }
}
...