StackView.pop() from Item on Stack
-
Hello there,
I have a problem with the StackView.
What I want to do is, to pop an Item from the stack triggered inside the item on the stack.Example:
main.qml:import QtQuick 2.4 import QtQuick.Controls 1.4 Item { id: appWidget width: 800 height: 400 ListModel { id:availableApps ListElement{ name: "App1" app: "App1/App1.qml" } } GridView { id: appsGrid anchors.fill: parent anchors.margins: 20 clip: true cellHeight: appsGrid.height/3 cellWidth: appsGrid.width/5 model: availableApps delegate: AppButton {onClicked: appStack.push(Qt.resolvedUrl(app))} // when clicked -> push view } StackView { id: appStack width: parent.width height: parent.height } }AppButton.qml
import QtQuick 2.4 Item { id: appButton width: GridView.view.cellWidth height: GridView.view.cellHeight signal clicked Text { id: appButtonLabel width: parent.width anchors.top: appButtonImage.bottom horizontalAlignment: Text.AlignHCenter font.pointSize: 14 text: qsTr(name) } MultiPointTouchArea { width: parent.width height: parent.height onReleased: appButton.clicked() } }App1.qml
import QtQuick 2.4 Item { id:alignment height: parent.height width: parent.width Rectangle { id: rec anchors.fill: parent color: "yellow" } MultiPointTouchArea { anchors.fill: parent onReleased: rec.color = "orange" // here I want to pop the item from the appStack } }I tried following things:
- call
pop()from within the Item viaStack.view.pop()as the Item knows, it is on a Stack, but that is not possible ... - emit a signal and than handle it with
currentItem.onSignalin theStackViewbut that also didn't work. - I also tried
if (appStack) appStack.pop()inside the item
As the
rec.color = "orange"is working, I don't think its an focus problem.The application shall later run on a touchscreen device without a keyboard.
- call
-
You mean from the Item on the Stack? I didn't, because it isn't possible or at least I don't know how.
What I had done is, that I tried to capture it, but didn't found a way to do it properly.This is how I tried to emit the signal:
In App1.qml I've addedsignal clickedthat was called instead of the color change withalignment.clicked()This is how I tried to capture it:
In theStackViewdeclaration I tried to callcurrentItem.onClicked: appStack.pop(),currentItem.item.onClicked: appStack.pop()andcurrentItem.Stack.view.pop()as I have seen somewhere but nether it of was accepted as valid qml code ... -
So, after playing around and a another few looks into the qt touch-gallery example, where they do exactly the with on of their buttons, I found a working solution and maybe a bug in the StackView.
But thats I'm not really sure of. Maybe someone with more experience in QtQuick and StackView can confirm it ;)After adding a
Textin App1 that displays the current stackdepth, I was surprised it shows a value of 2 even when I've only added one Item.
And from this visibility of the depth, I was able to see that the callif (appStack) appStack.pop()call atonReleased:inApp1is actually working. The last Item was popped so that that there was only one left on the stack. As those were both yellow I havn't seen the pop effect before.What I'm not sure about now:
- As I havn't found a rule, that a
StackViewalways needs ainitialItem, is it working as intended, that the first item to be added on a empty StackView is added twice? - Is it working as intended, that the last item on the Stackview can't be popped with
pop()but must be popped withclear()?
If anyone with more experience in QtQuick and the usage of StackView knows anything about this points, feel free to explain your knowledge/thougths.
If this is really a bug in StackView I would report it after confirmation ;)
PS: as a workaround for now I'm using
onReleased: appStack.depth > 1 ? appStack.pop() : appStack.clear()in App1.
Like this both instances on the Stack are popped at the same time. - As I havn't found a rule, that a