2012-06-06 1 views
6

Ho un qml che funge da output dell'applicazione (un po 'come una console di sola lettura). Tuttavia, è fastidioso da usare perché mentre stampa le informazioni scorre verso l'alto.Memorizza posizione di scorrimento nell'elemento QML

Ad esempio, diciamo che stampo una riga sul mio TextArea ogni secondo, dopo un minuto o così, avrò abbastanza linee che ora ho una barra di scorrimento. Scorro verso il basso, un secondo dopo, viene stampata una riga di testo che lo fa scorrere verso l'alto.

La funzionalità desiderata che desidero è quella di scorrere automaticamente verso il basso (molto simile a come è una console quando stampa fuori) a meno che l'utente non lo sostituisca scorrendo verso l'alto, quindi il testo dovrebbe rimanere inserito. Spero che aveva un senso, qui è un codice:

 ScrollArea { 
      id: helpTextScrollArea 
      anchors.left: parent.left 
      anchors.right: parent.right 
      anchors.top: myButton.bottom 
      anchors.topMargin: 5 
      anchors.bottom: parent.bottom 
      visible: false 
      horizontalScrollBar.visible: false 

      onVisibleChanged: { 
       helpText.visible = visible 
      } 

      HelpTextArea { 
       id: helpText 
       width: parent.parent.width - helpTextScrollArea.verticalScrollBar.width 
       text: "Oops, no documentation." 

       onVisibleChanged: { 
        if(helpTextScrollArea.visible != visible) { 
         helpTextScrollArea.visible = visible 
        } 
       } 
      } 
     } 

     Flickable 
     { 
      id: flick 

      anchors.left: parent.left 
      anchors.right: parent.right 
      anchors.top: runStopButton.bottom 
      anchors.bottom: parent.bottom 
      anchors.topMargin: 5 


      TextArea{ 

       id: messageArea 
       anchors.fill: parent 

       focus: true 

       readOnly: true 

       visible: !helpTextScrollArea.visible 

       wrapMode: TextEdit.Wrap 

       function addText(newText) { 
        text += newText + "\n" 
       } 
      } 
     } 

Nota: Non credo che il mio flickable fa niente, è stata parte della mia sperimentazione per risolvere il problema. Inoltre, utilizzo la funzione addText per stampare nell'area di testo. Non so quasi nulla di qml e la maggior parte di questo codice è stata scritta da qualcun altro e sto provando a lavorarci. Grazie!

risposta

3

È possibile associare la proprietà a Flickable a un'espressione che calcolerà la posizione corretta.

Flickable { 
    id: flick 
    states: State { 
     name: "autoscroll" 
     PropertyChanges { 
      target: flick 
      contentY: messageArea.height - height 
     } 
    } 
    onMovementEnded: { 
     if (contentY === messageArea.height - height) { 
      state = "autoscroll" 
     } 
     else { 
      state = "" // default state 
     } 
    } 
    // ... 
} 
2

flickable ha 4 proprietà di sola lettura a detta visibleArea * (potete leggere il loro significato nella documentazione QML):.

  • visibleArea.xPosition: XPOSITION = contentX/contentWidth
  • visibleArea.yPosition: yPosition = contentY/contentHeight
  • visibleArea.widthRatio: widthRatio = larghezza/contentWidth
  • visibleArea.heightRatio: heightRatio = altezza/contentHeight
0

Se si utilizza invece di GridView flickable, è possibile utilizzare questi metodi.

positionViewAtBeginning() 

positionViewAtEnd() 

positionViewAtIndex(int index, PositionMode mode) 

Ho trovato questi ad essere veramente utile, come quando viene aggiunto la riga di testo, basta chiamare il metodo positionViewAtEnd() interno della GridView.

Spero che sia utile