Qt android, новое окно qml не работает должным образом

У меня есть это главное окно:

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, когда я запускаю приложение, это поведение странно! Когда я нажимаю кнопку в главном окне, возникает эта ошибка: W/Qt ( 8903): (null):0 ((null)): QEGLPlatformContext::swapBuffers(): eglError: 12301, this: 0x6b46e7c0 хотя кажется, что вторая форма вызывается и главное окно становится неактивным. Но второго окна не видно. Хотя я не вижу внутри кнопки и, но когда я касаюсь области, в которой, как ожидается, будет расположена кнопка, она работает, и второе окно исчезает, затем первое окно снова становится активным. Когда я пытаюсь вернуться в главное окно, нажав кнопку возврата Android, он возвращается к главному окну, и это предупреждение: W/Qt ( 8903): (null):0 ((null)): Can't find surface 2 встречается,!

  • Не могли бы вы сказать мне, как я могу заставить qt показывать второе окно?
  • Согласно этой статье, приложение Qt будет состоять только из одного действия, которое можно запустить из приложения Android. Значит ли это, что не может быть нескольких окон? Я имею в виду несколько окон qml только с одним действием.
  • Если это так. Не могли бы вы сказать, есть ли альтернатива для разработки приложения, которое, по крайней мере, кажется многовариантным с точки зрения пользователя?
  • Каково ваше мнение об удалении всего содержимого окна приложения и замене его содержимым второго окна? Если мы добавим некоторые переходы, это будет похоже на переходы активности в Android. Но я беспокоюсь о проблемах с производительностью.

Спасибо за любую помощь

1 ответ

Вполне возможно, что на Android вы ограничены одним окном. Это имеет смысл, так как практически каждое Android-приложение имеет одно окно, даже если оно не полноэкранное.

Вот почему вы получаете ошибку при попытке создать второе окно, это не проблема с принуждением Qt к этому, это проблема с Android, не поддерживающим такие "ориентированные на рабочий стол" парадигмы пользовательского интерфейса. Похоже, что проблема заключается в множестве видимых поверхностей, а не в самих нескольких окнах. В Android, вероятно, существует ограничение только для одной видимой поверхности (именно поэтому элементы управления работают, даже если они не отображаются - объекты находятся в памяти) вы можете иметь "offscreen" столько, сколько вам нужно, но вам все равно придется проделать работу, чтобы скомпоновать их на видимой поверхности, что не имеет большого смысла делать в 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Я поставил все сразу для ясности. Вы также можете изменить скользящую анимацию по умолчанию без пользовательской.

В следующий раз, когда вы захотите создать приложение, которое будет работать как на настольных, так и на мобильных устройствах, держитесь подальше от функций, которые недоступны для всех ваших целей, таким образом, вам не придется возвращаться и искать способы их замены.

Другие вопросы по тегам