2012-06-06 20 views
6

Mam trochę qml, który działa jako wyjście z aplikacji (coś w rodzaju konsoli tylko do odczytu). Jest to jednak denerwujące, ponieważ podczas drukowania informacji przewija się z powrotem na górę.Zapamiętaj pozycję przewijania w elemencie QML

Na przykład, powiedzmy, że drukuję linię do mojej TextArea co sekundę, po minucie lub mniej, będę miał wystarczająco dużo linii, że mam teraz pasek przewijania. Przewiń do dołu, a sekundę później drukowany jest wiersz tekstu, powodujący przewijanie do góry.

Pożądaną funkcją, którą chciałbym, jest automatyczne przewijanie do dołu (podobnie jak w przypadku konsoli podczas drukowania), chyba że użytkownik nadpisuje to, przewijając w górę, a następnie tekst powinien pozostać na miejscu. Mam nadzieję, że sens, tu jest jakiś kod:

 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" 
       } 
      } 
     } 

Uwaga: Nie sądzę, żeby moja Flickable nic nie robi, to była część mojego eksperymentowania, aby rozwiązać problem. Używam także funkcji addText do drukowania w obszarze tekstowym. Prawie nic nie wiem o qml i większość tego kodu została napisana przez kogoś innego i próbuję z nim pracować. Dziękuję Ci!

Odpowiedz

3

Możesz powiązać właściwość contentY z Flickable z wyrażeniem, które obliczy właściwą pozycję.

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 posiada 4 właściwości tylko do odczytu w nazwie visibleArea * (można odczytać ich znaczenie w dokumentacji QML).

  • visibleArea.xPosition: xPosition = contentX/contentWidth
  • visibleArea.yPosition: yPosition = contentY/contentHeight
  • visibleArea.widthRatio: widthRatio = szerokość/contentWidth
  • visibleArea.heightRatio: heightRatio = wysokość/contentHeight
0

Jeśli używasz GridView zamiast Flickable, można korzystać z tych metod.

positionViewAtBeginning() 

positionViewAtEnd() 

positionViewAtIndex(int index, PositionMode mode) 

znalazłem je za bardzo pomocne, jak wtedy, gdy linia tekstu jest dodawana tylko wywołać metodę wnętrza GridViewpositionViewAtEnd().

Mam nadzieję, że pomoże

Powiązane problemy