2012-06-06 46 views
6

Tôi có một số qml hoạt động như đầu ra từ ứng dụng (loại giống như bàn điều khiển chỉ đọc). Tuy nhiên, nó gây phiền nhiễu khi sử dụng vì khi nó in thông tin, nó cuộn trở lại đầu trang. Ví dụ, cho phép nói rằng tôi in một dòng để TextArea của tôi mỗi giây, sau một phút hoặc lâu hơn, tôi sẽ có đủ dòng mà bây giờ tôi có một thanh cuộn. Tôi cuộn xuống phía dưới, một giây sau, một dòng văn bản được in khiến nó cuộn xuống đầu trang.Nhớ vị trí cuộn trong phần tử QML

Chức năng mong muốn tôi muốn là tự động cuộn xuống dưới cùng (giống như giao diện điều khiển khi in nội dung) trừ khi người dùng ghi đè điều này bằng cách cuộn lên, sau đó văn bản sẽ được đặt. Tôi hy vọng rằng có ý nghĩa, đây là một số mã:

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

Lưu ý: Tôi không nghĩ Flickable tôi bất cứ điều gì, nó là một phần của thử nghiệm của tôi để sửa chữa vấn đề. Ngoài ra, tôi sử dụng chức năng addText để in đến vùng văn bản. Tôi hầu như không biết bất cứ điều gì về qml và hầu hết các mã này được viết bởi người khác và tôi đang cố gắng để làm việc với nó. Cảm ơn bạn!

Trả lời

3

Bạn có thể liên kết contentY thuộc tính của Flickable với cụm từ sẽ tính toán vị trí thích hợp.

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 đã có 4 thuộc tính readonly trong gọi visibleArea * (bạn có thể đọc ý nghĩa của chúng trong tài liệu QML):.

  • visibleArea.xPosition: xPosition = contentX/contentWidth
  • visibleArea.yPosition: yPosition = contentY/contentHeight
  • visibleArea.widthRatio: widthRatio = chiều rộng/contentWidth
  • visibleArea.heightRatio: heightRatio = chiều cao/contentHeight
0

Nếu bạn đang sử dụng GridView thay vì Flickable, bạn có thể sử dụng các phương pháp này.

positionViewAtBeginning() 

positionViewAtEnd() 

positionViewAtIndex(int index, PositionMode mode) 

tôi thấy những là thực sự hữu ích, như khi các dòng văn bản đang được thêm vào, chỉ cần gọi các positionViewAtEnd() phương pháp bên trong GridView.

Hy vọng điều này sẽ giúp

Các vấn đề liên quan