Как закрыть окно Qml при создании QGLWidget

Я пытаюсь создать игру, в которой часть пользовательского интерфейса выполнена в qml (меню и т. Д.), А часть рендеринга и логики - на С ++. Для этого я использую подкласс QGLWidget. Игра начинается с Qml (с использованием QDeclarativeContext в основной функции), и при нажатии «NewGame» я загружаю свой подкласс QGLWidget. Что-то вроде этого:

GameButton{
    id:button2_1_1
    x: 69
    y: 101
    width: 80
    height: 80
    onClicked:{ myObject.initialize(); myObject.show(); }
}
// myObject sets the context property to the object of my QGLWidget subclass

Проблема в том, что я не могу найти способ закрыть окно Qml при загрузке QGLWidget. Как и в случае с тем, что я сделал, одновременно отображаются два окна.

Вот код для этого.

// импортировать QtQuick 1.0 // в S60 5th Edition или Maemo 5 импортировать QtQuick 1.1

Rectangle {
id:newGameMenu
width: 640
height: 360
signal button2Clicked();
onButton2Clicked: console.log("new game should start")


Image{
    id:background
    source:"menubackground.jpg"
    anchors.fill:parent

    Button2 {
        id: button21
        x: 70
        y: 101
        width: 42
        height: 42
    }
}

Button2{
    id:button2_1_1
    x: 69
    y: 101
    width: 44
    height: 44
    onClicked:{ myObject.abc(); myObject.show(); console.log("glwindow called"); }
}

}

main.cpp


#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QDeclarativeView>
#include <QDeclarativeItem>
#ifndef GLWINDOW_H
#include "glwindow.h"
#endif
#include <QObject>

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));
    QDeclarativeView view;
    GLWindow w;
    view.rootContext()->setContextProperty("myObject", &w);
    view.setSource(QUrl::fromLocalFile(""));
    view.show();
    qDebug() << "into the qml";


    return app->exec();

}


person akhil    schedule 23.03.2012    source источник


Ответы (4)


Как и в случае с тем, что я сделал, одновременно отображаются два окна

Мне кажется, что вы показываете два окна, одно QDeclarativeView и другое QGLWidget. В этом случае вы должны попытаться скрыть свой QDeclarativeView, когда вы показываете QGLWidget,

person Kunal    schedule 23.03.2012
comment
Я не могу скрыть свой QDeclarativeView - person akhil; 23.03.2012
comment
Вы можете объяснить? что вы пробовали и что происходит, когда вы пытаетесь это скрыть? - person Kunal; 23.03.2012
comment
Я попытался установить .visible = false для виджета меню в onClicked. Но он делает невидимые изображения в меню, а не закрывает окно. Я хочу сказать, что даже сейчас вижу одновременно пустое окно и другое окно. - person akhil; 23.03.2012
comment
Я не вижу здесь кода вашего виджета меню, но я думаю, что вы пытаетесь скрыть элемент QML, а не QDeclarativeView, поэтому вы видите черное окно. - person Kunal; 23.03.2012
comment
поскольку QDeclarativeView является производным от QWidget, вы можете просто вызвать его метод hide. - person Kunal; 23.03.2012
comment
Да, я сделал то, что намеревался ... Ваш ответ был действительно полезным. Спасибо. - person akhil; 29.03.2012

см. http://qt-project.org/forums/viewthread/4109, который, вероятно, отвечает ваш вопрос

person Chris Browet    schedule 23.03.2012

Попробуйте установить .visible=false для виджета меню в onClicked.

person Community    schedule 23.03.2012
comment
Я пробовал, но он делает изображения в меню невидимыми, а не закрывает окно. Я хочу сказать, что даже сейчас вижу одновременно пустое окно и другое окно. - person akhil; 23.03.2012
comment
Можете ли вы предоставить больше вашего кода QML в вопросе? В частности, код QML для виджета меню, который включает GameButton. - person ; 23.03.2012

А как насчет http://qt-project.org/forums/viewthread/15160/

Также я бы использовал QStackedWidget с двумя QWidgets: один был бы QDeclarativeView, который содержит ваш QML, и другой QGLWidget, который содержит ваш OpenGL; Переход между QML и OpenGL означал бы вызов QStackedWidget :: setCurrent ();

person Ionut    schedule 26.03.2012