Qt android,新的qml窗口无法正常工作

时间:2015-03-10 10:25:50

标签: android qt qtandroidextras

我有这个主窗口:

ApplicationWindow {
    id : mainWindow
    width: 640
    height: 480
    visible: true

    Button{
        text: "go back to form 1"
        onClicked: {
            form2.visible = true;
        }
    }

    SecondForm{
        id: form2
    }
}

第二个窗口是:

Window{
    id: main
    width: 640
    height: 480
    x: 0
    y: 0
    visible: false;
    Button{
        text: "go back to form 1"
        onClicked: {
            main.visible = false;
        }
    }
}

桌面版本是好的,但在android中运行应用程序时,它的行为很奇怪!当我单击mainWindow中的按钮时,会出现此错误:W/Qt ( 8903): (null):0 ((null)): QEGLPlatformContext::swapBuffers(): eglError: 12301, this: 0x6b46e7c0虽然似乎调用了第二个窗体并且主窗口变为非活动状态。但第二个窗口不可见。虽然我看不到内部的按钮和按钮,当我触摸按钮预期位于的区域时,显然它可以工作,第二个窗口消失,然后第一个窗口再次激活。 当我尝试通过单击android后退按钮返回mainWindow时,它会返回到mainWindow并发出此警告:W/Qt ( 8903): (null):0 ((null)): Can't find surface 2发生!

  • 你能否告诉我如何强制qt显示第二个窗口?
  • 根据this article,Qt应用程序只包含一个可以从Android应用程序启动的活动。这是否意味着没有办法拥有多个窗口?我的意思是几个只有一个活动的qml窗口。
  • 如果是这样的话。您能否告诉我是否有其他方法可以开发一个应用程序,从用户的角度来看,该应用程序至少似乎是多视图?
  • 您对删除应用程序窗口的所有内容并将其替换为第二个窗口的内容有何看法?如果我们添加一些转换,它看起来像android中的活动转换。但我担心性能问题。

感谢您的帮助

1 个答案:

答案 0 :(得分:7)

在Android上完全可能只限于一个窗口。这是有道理的,因为基本上每个Android应用程序都有一个窗口应用程序,甚至是那些不是全屏的应用程序。

这就是为什么你在尝试创建第二个窗口时遇到错误,强迫Qt这样做不成问题,这是Android不支持这种“桌面中心”UI范例的问题。问题似乎是具有多个可见表面的问题,而不是多个窗口本身,在Android中可能只有一个可见表面的限制(这就是为什么即使没有显示控件也能工作 - 对象存在于内存中) ,你可以根据需要设置“offscreen”,但是你仍然需要将它们组合到可见的表面上,这对于多个窗口来说在Qt中没有多大意义。 - Android甚至不支持的功能。

您必须找到一种方法,可以在一个窗口中同时或仅在用户请求时撰写多个窗口的内容。

  • 您可以实施一些布局管理,将主窗口拆分到不同的区域以容纳来自辅助窗口的内容,但是这样您可能会发现您的“工作区域”缩小到可接受的范围以下,但如果您需要所有内容同时在scree上,这是你唯一的解决方案,从好的方面来看,即使你使用多个窗口,你也会受到显示尺寸的限制,除非它们重叠

  • 对于偶尔需要的内容,您可以将其放在不同的标签中,或者有一些停靠的图标来显示和隐藏该内容,它将显示在主窗口的顶部,您可以将其填满屏幕或部分屏幕,使用它然后隐藏它。

  • 最后但并非最不重要的是,您可以使用堆栈视图QML comes with one and it even supports animated transitions - 您可能需要做一些额外的工作来调整您的应用程序以“堆栈方式”工作,这是您应该做的事情从一开始,可视化堆栈是移动应用程序最常用的方法,需要在彼此之上打开多个对话框。

在这个例子中,我修改了你的代码以使用堆栈视图并从第二个表单返回一个值到第一个表单来说明你可以实现的一种方式(或者你可以只使用一个属性):

ApplicationWindow {
    id: main
    width: 640
    height: 480
    visible: true

    StackView {
        id: stack
        anchors.fill: parent
    }

    Component {
        id: form1
        Rectangle {
            width: 640
            height: 480
            color: "lightblue"
            function setText(text) { txt.text = text }
            Column {
                Button {
                    text: "open form2"
                    onClicked: stack.push(form2)
                }
                Text {
                    id: txt
                    text: "text has not been set yet"
                }
            }
        }
    }

    Component {
        id: form2
        Rectangle {
            id: f2
            width: 640
            height: 480
            color: "lightgreen"
            Column {
                TextEdit {
                    id: txt
                    text: "enter text here"
                }

                Button {
                    text: "set text"
                    onClicked: {
                        var prev = stack.get(f2.Stack.index - 1)
                        prev.setText(txt.text)
                        stack.pop()
                    }
                }
            }
        }
    }

    Component.onCompleted: stack.push(form1)
}

当然,您可以将表单放在不同的qml文件中而不使用Component,为了清楚起见,我将其全部放在一起。您也可以在没有自定义滑动动画的情况下更改默认滑动动画。

下次您要制作适用于桌面设备和移动设备的应用时,请远离所有目标无法使用的功能,这样您就可以避免返回并找到替代它们的方法。< / p>