7

我有这个主窗口:

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尽管似乎调用了第二种形式并且主窗口变为非活动状态。但第二个窗口是不可见的。虽然我看不到里面的 from 和按钮,但是当我触摸按钮预期所在的区域时,它显然可以工作并且第二个窗口消失,然后第一个窗口再次变为活动状态。当我尝试通过单击 android 后退按钮返回到主窗口时,它会返回到主窗口并出现此警告:W/Qt ( 8903): (null):0 ((null)): Can't find surface 2发生!

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

谢谢你的帮助

4

1 回答 1

8

在 Android 上,您完全有可能被限制在一个窗口中。这是有道理的,因为基本上每个 Android 应用程序都有一个窗口应用程序,即使是那些不是全屏的应用程序。

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

您必须找到一种方法来在单个窗口中组合多个窗口的内容,无论是同时还是仅应用户请求。

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

  • 对于偶尔需要的内容,您可以将其放在不同的选项卡中,或者使用一些停靠图标来显示和隐藏该内容,它将出现在主窗口的顶部,您可以将其全屏或仅部分显示,使用它然后隐藏起来。

  • 最后但并非最不重要的一点是,您可以使用堆栈视图,QML 带有一个,它甚至支持动画转换- 您可能需要做一些额外的工作来使您的应用程序以“堆栈方式”工作,这是您应该做的一开始,视觉堆栈是移动应用程序最常用的方法,它需要在彼此之上打开多个对话框。

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

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, 为了清楚起见,我将它们全部放在一起。您还可以更改没有自定义的默认滑动动画。

下次您想制作一个可在桌面和移动设备上运行的应用程序时,请远离并非在所有目标上都可用的功能,这样您就不必回头寻找替代它们的方法。

于 2015-03-12T13:06:51.393 回答