TextAreaまたはScrollViewがある場合、スクロール位置を手動で設定し、理想的にはそれに反応するにはどうすればよいですか。
これはログ ウィンドウを作成するためのものです。テキストを追加し、ビューが以前に一番下までスクロールされた場合に、そこに再びスクロールされるようにしたいのです。
TextAreaまたはScrollViewがある場合、スクロール位置を手動で設定し、理想的にはそれに反応するにはどうすればよいですか。
これはログ ウィンドウを作成するためのものです。テキストを追加し、ビューが以前に一番下までスクロールされた場合に、そこに再びスクロールされるようにしたいのです。
どうぞ:
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Window 2.0
ApplicationWindow {
id: app
title: qsTr("Hello World")
width: 640
height: 480
function getTextLine(i) {
var textLines = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.
Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus.
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.".split("\n");
return textLines[i].trim();
}
Timer {
property int i: 0
running: true
interval: 1000
repeat: true
onTriggered: {
if (i < 10) {
txt.text = txt.text.toString() + "\n\n" + getTextLine(i)
}
i += 1
}
}
ScrollView {
id: sv
width: 600
height: 300
frameVisible: true
Flickable {
id: flickable
anchors.fill: parent
contentY: 50
flickableDirection: Flickable.VerticalFlick
contentHeight: txt.height
Component.onCompleted: {
console.log("Content height:", contentHeight)
console.log("Height:", height)
console.log("Implicit Height:", implicitHeight)
console.log("Content Y:", contentY)
}
onContentYChanged: {
console.log("Content Y:", contentY)
}
TextEdit {
id: txt
height: contentHeight
width: 600-30
wrapMode: TextEdit.Wrap
onTextChanged: {
flickable.contentY = contentHeight - flickable.height
}
text: ""
}
}
}
}
これは、Simon Warta に基づいたログ ウィンドウの私のソリューションです。それはかなりうまく機能し、ほとんどが標準的な方法で動作します.一番下までスクロールすると、出力に従います。そこから離れてスクロールすると、フォローが停止します。これは、Java では明らかに不可能なことです。(少なくとも Eclipse と IntelliJ は正しく動作しません。)
残念ながら、 には奇妙なバグがあり、TextEdit
テキストを削除してから追加すると正しく更新されません。誰かがこれについて何か考えを持っているなら、それは知っておくとよいでしょう. それ以外の場合は、すべてのテキストを選択してからすぐに選択を解除すると機能することがわかりました。残念ながら、ウィンドウからテキストをコピーすることはできません。
とにかく、ここに私のコードがあります。
import QtQuick 2.0
import QtQuick.Controls 1.2
ApplicationWindow {
width: 500
height: 300
Timer {
property int i: 0
running: true
interval: 250
repeat: true
onTriggered: {
i += 1;
root.appendLine(new Array(30).join(i + "_"));
if (i === 100)
root.clear();
}
}
ScrollView {
id: root
anchors.fill: parent
frameVisible: true
property int maxLines: 50
function appendLine(line)
{
// If we are scrolled near the end (up to 30 pixels away)
// then scroll right to the end.
var following = flickable.contentY > text.height - flickable.height - 30;
line = String(line);
text.lineLengths.push(line.length);
if (text.lineLengths.length > maxLines)
text.remove(0, text.lineLengths.shift()+1); // Plus 1 for new line.
text.append(line);
// These line work around a weird bug where it doesn't update the view.
text.selectAll();
text.deselect();
if (following && text.height > flickable.height)
flickable.contentY = text.height - flickable.height;
}
function clear()
{
text.text = "";
text.lineLengths = [];
flickable.contentY = 0;
}
Flickable {
id: flickable
anchors.fill: parent
flickableDirection: Flickable.VerticalFlick
contentHeight: text.height
TextEdit {
id: text
// We have to store the length of each line because TextEdit
// doesn't provide any *fast* ways to calculate it (accessing `text`
// is extremely slow since it copies everything to/from javascript).
property var lineLengths: []
width: root.width - 30 // Space for scroll bar.
wrapMode: TextEdit.Wrap
text: ""
}
}
}
}