如何在创建QGLWidget时关闭Qml窗口

时间:2012-03-23 04:55:03

标签: qt qml qglwidget

我正在尝试构建一个游戏,其中ui部分是用qml(菜单等)制作的,而渲染和逻辑部分是用C ++编写的。为此,我使用的是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

问题是当我加载QGLWidget时,我无法找到关闭Qml窗口的方法。与我所做的一样,两个窗口同时显示。

这是代码。

//导入QtQuick 1.0 //以S60第5版或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();

}

4 个答案:

答案 0 :(得分:1)

  

与我所做的一样,两个窗口同时显示

我觉得你正在展示两个窗口,一个QDeclarativeView和其他QGLWidget。 在这种情况下,你应该在显示QGLWidget时尝试隐藏你的QDeclarativeView,

答案 1 :(得分:1)

请参阅可能回答您问题的http://qt-project.org/forums/viewthread/4109

答案 2 :(得分:0)

尝试在.visible=false中为菜单小部件设置onClicked

答案 3 :(得分:0)

http://qt-project.org/forums/viewthread/15160/

怎么样?

另外我会使用带有2个QWidgets的QStackedWidget:一个是QDeclarativeView,它包含你的QML,另一个是QGLWidget,它包含你的OpenGL;在QML和OpenGL之间移动意味着调用QStackedWidget :: setCurrent();