Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. StackView.pop() from Item on Stack
Forum Updated to NodeBB v4.3 + New Features

StackView.pop() from Item on Stack

Scheduled Pinned Locked Moved Solved QML and Qt Quick
4 Posts 2 Posters 4.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    Stoepsler
    wrote on last edited by Stoepsler
    #1

    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 via Stack.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.onSignal in the StackView but 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.

    1 Reply Last reply
    0
    • L Offline
      L Offline
      literA2
      wrote on last edited by literA2
      #2

      how did you capture a signal from StackView?

      1 Reply Last reply
      0
      • S Offline
        S Offline
        Stoepsler
        wrote on last edited by Stoepsler
        #3

        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 added signal clicked that was called instead of the color change with alignment.clicked()

        This is how I tried to capture it:
        In the StackView declaration I tried to call currentItem.onClicked: appStack.pop(),currentItem.item.onClicked: appStack.pop() and currentItem.Stack.view.pop() as I have seen somewhere but nether it of was accepted as valid qml code ...

        1 Reply Last reply
        0
        • S Offline
          S Offline
          Stoepsler
          wrote on last edited by Stoepsler
          #4

          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 Text in 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 call if (appStack) appStack.pop() call at onReleased: in App1 is 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 a initialItem, 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 with clear() ?

          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.

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved