[SOLVED] ListView's flickable problems
-
Alicemirror: I don't think this is a memory problem, because I use QAbstractListModel to provide the data, and following is the data function that I used:
@QVariant RFileModel::data(const QModelIndex & index, int /role/) const {
int row = index.row();
return data(row);
}QVariant RFileModel::data(int row) const {
// return QVariant();
if (row < m_file_line_pos.count()) {
if (m_file->seek(m_file_line_pos[row])) {
QTextStream stream(m_file);
stream.setCodec(m_codec);
stream.setAutoDetectUnicode(true);
QString str = stream.readLine();
if (str.length() || !m_file->atEnd()) {
qDebug()<<"Read str row"<<row
<<"pos"<<m_file_line_pos[row]
<<"length"<<str.length()<<str;
return str+KNewLine;
}
else {
qDebug()<<"read file line failed, line number"<<row
<<"Position"<<m_file_line_pos[row]
<<m_file->errorString();
}
}
else {
qDebug()<<"could not seek to position/line"<<m_file_line_pos[row]<<row;
}
}
else {
qDebug()<<"row number is too large:row/max"<<row<<m_file_line_pos.count();
}
return QVariant();
}@ -
Thank yo Alex, just a ping :) I'll answer to this shortly
-
[quote author="Milnadar" date="1316020663"]I noticed that when (vertical) listView's items has different height, contentHeight value doesn't equal to height of all items. When changing ListView's height, contentHeight may be larger or smaller than it should be. Why is it so? How does ListView count it's contentHeight?[/quote]
When items in a vertical ListView don't have a fixed height, contentHeight is estimated. This is to avoid the cost of instantiating every item in order to query their actual height.
Regards,
Michael -
I
m sorry to bring this topic from the dead, but I still don
t see what is the solution to this problem and I need to solve this.Here is the example of the code on which I`m trying to resolve the problem with contentHeight change and also with a problem when you go to positionViewAtEnd() contentY get some strange values:
@
import QtQuick 1.1Rectangle
{
width: 360
height: 360ListView { id: lv anchors.fill: parent anchors.bottomMargin: 50 spacing: 5 model: msgmodel delegate: Rectangle { id: rect; width: lv.width; height: txt.height; Text { id: txt; width: 50; anchors.topMargin: 5; wrapMode: Text.WordWrap; text: " contentY: " + lv.contentY + "|" + lv.contentHeight + " y: " + y + " " + msgtext; } } } Text { id: btn; objectName: "btn"; signal add(); text: "Click to move at end" anchors.bottom: parent.bottom MouseArea { anchors.fill: parent onReleased: lv.positionViewAtEnd(); } }
}
@Every time I go to view end contentY at the top of the view goes more in negative value.
EDIT: I have also tried this in QtQuick 2.0 and it is working better but it still has problem when going to view end. But this time instead of going into negative value, contentY increase its value.
-
Thank you for the good discussion.
Helped me a lot to understand my problem.Even so it is kind of disappointing, that we can't even use the sizeHintRole for ListViews.
Or have an option to supply the ListView with the correct contentHeight, so it doesn't try calculate it on its own...I've the idea of wrapping the actual list view into another flick able object to kind of wrap the broken scrolling with an item i can control the scrolling better. If it works I'll paste it here.
-
Well I found another solution. I post here so maybe it helps sombedody.
-
You need to declare a global property which stores the height. For example : reViewHeight
-
Put the ListView inside a transparent Rectangle: rcView, and put the rectangle inside the ScrollView
-
Add: Component.onCompleted: { reViewHeight = reViewHeight + height} in your delegate definition
-
In the ListView add: onCountChanged: { rcView.height = reViewHeight }
Done !
-