2012-06-06 17 views
6

私はアプリケーションからの出力として機能するいくつかのqmlを持っています(読み取り専用コンソールのようなもの)。しかし、情報を印刷するときに、上にスクロールするため、使用するのは面倒です。QML要素のスクロール位置を覚えている

たとえば、1分ごとにTextAreaに行を印刷すると、今はスクロールバーがある十分な行があります。私は一番下にスクロールし、一秒後にテキストの行が印刷され、上にスクロールします。

私が望む機能は、ユーザーがスクロールして上書きしない限り、自動的に一番下にスクロールすることです。

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

注:私は、作られた感覚が、ここにいくつかのコードであることを願って、私は私のFlickableは何もないとは思わない、それは私の問題を修正するために実験の一部でした。また、テキスト領域に印刷するには、addTextという関数を使用します。私はqmlについてほとんど知りません。このコードのほとんどは他の誰かによって書かれており、私はそれを使って作業しようとしています。ありがとうございました!

答えて

3

contentYプロパティをFlickableにバインドして、適切な位置を計算する式にすることができます。

Flickableと呼ばれるvisibleAreaで4つの読み取り専用のプロパティを持っている*(あなたはQMLのドキュメントでその意味を読み取ることができます)
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

:。

  • visibleArea.xPosition:xPosition = contentX/contentWidth
  • visibleArea.yPosition:yPosition = contentY/contentHeight
  • visibleArea.widthRatio:=幅/ contentWidth
  • widthRatio visibleArea.heightRatio:heightRatio =高さ/ contentHeight
0

あなたはGridViewの代わりにFlickableを使用している場合は、これらのメソッドを使用することができます。

positionViewAtBeginning() 

positionViewAtEnd() 

positionViewAtIndex(int index, PositionMode mode) 

私は、テキストの行が追加されているときに、ちょうどGridViewのpositionViewAtEnd()メソッドを呼び出すと、これらは本当に便利であることが判明。

希望すると助かります

関連する問題