a.t*_*aby 6 qt android qtandroidextras
我有这个主窗口:
ApplicationWindow {
id : mainWindow
width: 640
height: 480
visible: true
Button{
text: "go back to form 1"
onClicked: {
form2.visible = true;
}
}
SecondForm{
id: form2
}
}
Run Code Online (Sandbox Code Playgroud)
第二个窗口是:
Window{
id: main
width: 640
height: 480
x: 0
y: 0
visible: false;
Button{
text: "go back to form 1"
onClicked: {
main.visible = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
桌面版本是好的,但在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
发生!
谢谢你的帮助
在Android上完全可能只限于一个窗口.这是有道理的,因为基本上每个Android应用程序都有一个窗口应用程序,甚至那些不是全屏的应用程序.
这就是为什么你在尝试创建第二个窗口时遇到错误,强迫Qt这样做不成问题,这是Android不支持这种"桌面中心"UI范例的问题.问题似乎是具有多个可见表面的问题,而不是多个窗口本身,在Android中可能只有一个可见表面的限制(这就是为什么即使没有显示控件仍然工作 - 对象存在于内存中) ,你可以根据需要设置"offscreen",但是你仍然需要将它们组合到可见的表面上,这对于多个窗口来说在Qt中没有多大意义. - Android甚至不支持的功能.
您必须找到一种方法,可以在一个窗口中同时或仅在用户请求时组合多个窗口的内容.
你可以实现一些布局管理来分割不同区域的主窗口以容纳来自辅助窗口的内容,但是这样你可能会发现你的"工作区域"缩小到可接受的范围之下,但是如果你同时需要scree上的所有内容,那就是唯一的解决方案,从好的方面来看,即使你使用多个窗口,你也会受到显示尺寸的限制,除非它们是重叠的
对于偶尔需要的内容,您可以将其放在不同的选项卡中,或者有一些停靠的图标来显示和隐藏该内容,它将显示在主窗口的顶部,您可以全屏或部分使用它,使用它然后隐藏它.
最后但并非最不重要的是,您可以使用堆栈视图,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)
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以将表单放在不同的qml文件中,如果没有Component
,我为了清楚起见将其全部放在一起.您也可以更改默认滑动动画而无需自定义滑动动画.
下次要制作适用于桌面设备和移动设备的应用时,请远离所有目标无法使用的功能,这样您就可以避免返回并找到替换它们的方法.