Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
14 августа 2018 г. 6:17

Переключение страниц и перевод фокуса на потомка новой страницы

QML

Приветствую. Пытаюсь сделать многостраничный интерфейс. На каждой странице есть либо PathView, либо ListView. Управление происходит в них только с клавиатуры (без мыши или тачпада). Многостраничность реализую с помощью StackView. Но столкнулся со следующей проблемой: когда я выполняю push новой страницы из обработчика нажатия клавиатуры в PathView первой страницы StackView, то выводится новая страница, но фокус остается на PathView первой страницы. И соответственно клавиатура продолжает обрабатываться в PathView первой страницы. Подскажите как правильно переводить фокус в данном случае? И в целом правильный ли я выбрал путь реализации многостраничного интерфейса? Код:

main
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window
{
    visible: true
    width: 480
    height: 320
    title: qsTr("Hello World")

    StackView
    {
        id: stackMenu
        initialItem: "menuMain.qml"
        focus: true

        function setPage(name)
        {
            stackMenu.push(name);
        }
    }
}
menuMain.qml
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Item
{
    PathView
    {
        anchors.fill: parent
        focus: true

        model: ListModel
        {
            ListElement
            {
                color: "lightgreen"
                title: "Печать"
            }
            ListElement
            {
                color: "orange"
                title: "Настройки"
            }
            ListElement
            {
                color: "orchid"
                title: "Инфо"
            }
        }
        delegate: Rectangle
        {
            id: rect
            width: 100; height: 100
            color: model.color
            scale: PathView.scale
            opacity: PathView.opacity
            z: PathView.z
            Text
            {
                anchors.horizontalCenter: parent.horizontalCenter
                text: model.title
            }
        }
        path: Path
        {
            startX: 240; startY: 200
            PathAttribute { name: "z"; value: 10}
            PathAttribute { name: "scale"; value: 1.5 }
            PathAttribute { name: "opacity"; value: 1 }
            PathQuad { x: 240; y: 50; controlX: 0; controlY: 100 }
            PathAttribute { name: "z"; value: 1}
            PathAttribute { name: "scale"; value: 0.3 }
            PathAttribute { name: "opacity"; value: 0.3 }
            PathQuad { x: 240; y: 200; controlX: 480; controlY: 100 }
        }

        Keys.onLeftPressed:
        {
            decrementCurrentIndex();
            console.log(currentIndex)
        }
        Keys.onRightPressed:
        {
            incrementCurrentIndex();
            console.log(currentIndex);
        }
        Keys.onSpacePressed:
        {
            console.log(currentIndex);
            if(currentIndex == 1)
                stackMenu.setPage("menuSettings.qml");
        }
    }
}

Код модуля menuSettings.qml практически идентичен menuMain.qml (отличается только модель, но вряд ли это важно)

2

Добрый день.

У stackview есть свойство currentItem, если память не изменяет.
То поэтому можно так написать
currentItem.focus = true. После того как пушнули страничку. Тогда фокус должен правильно установиться.
В принципе путь с использованием StackView вполне нормальный, особенно, если реализовывать вложенный стек страниц.




Для Django рекомендую VDS-хостинг TIMEWEB

0

Большое спасибо. Подтолкнули меня на мысль вынести обработку клавиш из PathView на всю страницу. И тогда - да, ваша подсказка работает. добавил в StackView onCurrentItemChanged: currentItem.focus = true

И теперь работает как надо.


0

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
18 ноября 2018 г. 19:19
cyrillwork

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
16 ноября 2018 г. 19:09
Илья Завьялов

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
16 ноября 2018 г. 12:49
Ирина Минигузина

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
Последние комментарии
16 ноября 2018 г. 6:50
Евгений Легоцкой

Добрый день! шаблон не находит, или шаблон неправильно прописали, или тег шаблона неправильно написан, иных выводов сделать не могу, из того, что вы написали. трейсбек нужно смотреть. Со...
16 ноября 2018 г. 6:48
Евгений Легоцкой

пройтись циклом по всем виджетам в обратном порядке for (int i = ui->vertialLayout->count() - 1; i >= 0; --i){ QWidget* w = ui->verticalLyout->itemAt(i)->widget();...
15 ноября 2018 г. 21:35
chunk

Доброго времени суток Евгений. Не подскажете что я делаю не так? Получаю ошибку такого характера: Reverse for 'add_comment' with arguments '('',)' not found. 1 pattern(s) tried: ...
15 ноября 2018 г. 15:35
Михаиллл

Спасибо. Похоже где то описку сделал, поэтому не работало. Я добавил на verticalLayout много виджитов. А можно ли их как то быстро и просто удалить?
15 ноября 2018 г. 14:55
Евгений Легоцкой

verticalLayout - это, по-моему предположению, должен быть у вас объект класса QVBoxLayout, который наследован от QBoxLayout. Поэтому открываете документацию на QVBoxLayout ...
Сейчас обсуждают на форуме
18 ноября 2018 г. 18:11
Metelev

Большое спасибо, все получилось, завтра начну изучать код.
18 ноября 2018 г. 17:49
Чарльз Грин

Спасибо, буду разбераться
17 ноября 2018 г. 14:13
Чарльз Грин

Я сейчас занимаюсь мультимедией, это аудио и видео, программы для концертов и т. д. Бибилиотека Qt очень помогает, она надежная, а надежность в моих приложениях очень важный фактор чтоб не пол...
16 ноября 2018 г. 16:28
Евгений Легоцкой

Добрый день! Спасибо, что воспользовались именно форумом. Заниматься курсовыми работами чьими-то ни было у меня времени нет, у самого полторы работы. Но что-то подсказать на фо...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы