我有这样的代码:
ScrollView {
Image {
source: "..."
}
}
Image
高于ScrollView
。如何将后者滚动到Image
?
答案 0 :(得分:10)
尽管有外观,ScrollView
与Flickable
紧密相关。实际上,Flickable
用于控制可见区域。这样的Item
可用作(readonly
)属性flickableItem
。 Flickable
具有contentX
和contentY
属性来控制当前可见区域。这些属性可以与width
的{{1}}和height
结合使用,将可见区域精确定位在中心位置。通常你有:
ScrollView
差异是必要的,因为第一次调用只是将中心移动到可见区域的左上角(flickableItem.contentY = flickableItem.contentHeight / 2 - height / 2
flickableItem.contentX = flickableItem.contentWidth / 2 - width / 2
/ contentX
所在的位置)。
以下是contentY
作为主要子级Image
的完整示例。
免责声明 :在示例提出的简单方案中,使用remotelly加载的图像,在调用ScrollView
时仍可以取消设置大小,导致中心代码无法正常工作。通过将宽度和高度直接设置为代码,可以避免问题。在实际情况下,这样的细节应该是不必要的。
onCompleted
答案 1 :(得分:2)
从Qt 5.14开始(也许在5.12版本中),您现在可以轻松进行操作:
ScrollView {
Component.onCompleted {
// scroll to vertical center
ScrollBar.vertical.position = 0.5
}
// put your content item here:
Image {
// …
}
}
答案 2 :(得分:1)
这是QQC2的解决方案。在Qt 5.12上进行了测试。
解决方案很简单,只需存储scrollBar指针并根据需要控制它即可。
ScrollView2.qml
import QtQuick 2.0
import QtQuick.Controls 2.4
ScrollView {
id: root
property ScrollBar hScrollBar: ScrollBar.horizontal
property ScrollBar vScrollBar: ScrollBar.vertical
/**
* @param type [Qt.Horizontal, Qt.Vertical]
* @param ratio 1.0 to 1.0
*/
function scrollTo(type, ratio) {
var scrollFunc = function (bar, ratio) {
bar.setPosition(ratio - bar.size/2)
}
switch(type) {
case Qt.Horizontal:
scrollFunc(root.hScrollBar, ratio)
break;
case Qt.Vertical:
scrollFunc(root.vScrollBar, ratio)
break;
}
}
}
main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible: true
width: 500
height: 500
ScrollView2 {
id: scroll
anchors.fill: parent
Text {
width: 1000
height: 1000
text: "ABC"
font.pixelSize: 800
Component.onCompleted: {
scroll.scrollTo(Qt.Horizontal, 0.5)
scroll.scrollTo(Qt.Vertical, 0.5)
}
}
}
}