Перейти к определенному элементу в QtQuick StackView

Я использую Qt 5.2.1 на Android, и у меня есть главное окно приложения с кодом, как показано ниже (пример немного надуманный, но он точно показывает, что я делаю):

property Component mainMenuView: MainMenuView {
    onMoviesSelected: {
        stackView.push(moviesListView)
    }
    onSettingsSeleted: { }
    onAboutSeleted: { }
}

property Component moviesListView: MovieListView {
    onMovieSelected: {
        stackView.push(movieDetailView)
    }
    onBack: stackView.pop()
}

property Component movieDetailView: MovieDetailView {
    onCreditsSelected: {
        stackView.push(personListView)
    }
    onBack: stackView.pop()
}

property Component personListView: PersonListView {
    onPersonSelected: {
        // Pending...
    }
    onBack: stackView.pop()
}

По идее, вы выбираете из меню, вы смотрите фильмы. Вы выбираете из фильмов, вы видите детали фильма. Вы выбираете для просмотра титры, вы видите список актеров и съемочной группы. Все это использует StackView и отлично работает. Кнопка «Назад» также работает нормально, поочередно открывая просмотры при возврате.

Итак, теперь, когда я выбираю конкретного человека из personListView, я хочу сразу вернуться к moviesListView и пропустить промежуточное movieDetailView. Идея состоит в том, что в списке фильмов теперь отображаются только фильмы, в которых есть выбранный человек.

Я знаю, что мог бы, а может, и должен был бы просто нажать еще moviesListView в этом случае, но этот пример создан для описания общей проблемы.

Для этого вы можете вызвать метод StackView pop() и указать «элемент», к которому вы хотите вернуться - поэтому я попробовал это:

property Component personListView: PersonListView {
    onPersonSelected: {
        stackView.pop(moviesListView)
    }
    onBack: stackView.pop()
}

Когда это запускается, сообщений об ошибках нет (поэтому я предполагаю, что он знает, что movieListView - это что-то, что существует), но он возвращается к непосредственно предыдущему представлению, то есть к movieDetailView. Он должен пропустить этот вид и показать movieListView.

Если я попытаюсь вернуться к mainMenuView, он все равно просто вернется к непосредственно предыдущему movieDetailView.

Связано ли это как-то с тем, как я использую Component для своих представлений, и если да, что мне делать, или что-то еще не так?


person caprica    schedule 16.04.2014    source источник


Ответы (1)


Похоже на ошибку. Я могу воспроизвести это на следующем примере:

import QtQuick 2.2
import QtQuick.Controls 1.1

Rectangle {
    property Component mainMenuView: Button {
        text: "mainMenuView"
        onClicked: {
            Stack.view.push(moviesListView)
        }
    }

    property Component moviesListView: Button {
        text: "moviesListView"
        onClicked: {
            Stack.view.push(movieDetailView)
        }
    }

    property Component movieDetailView: Button {
        text: "movieDetailView"
        onClicked: {
            Stack.view.push(personListView)
        }
    }

    property Component personListView: Button {
        text: "personListView"
        onClicked: {
            // Wrong: goes to movieDetailView.
            Stack.view.pop(moviesListView)
            // Wrong: goes to mainMenuView.
//            Stack.view.pop({item: moviesListView})
        }
    }

    StackView {
        initialItem: mainMenuView
    }
}

Для этого я создал QTBUG-39423.

person Mitch    schedule 03.06.2014