ich habe folgende Scrollview mit Listview innen bekam:QML Listenansicht Artikel verschwinden beim Scrollen
ScrollView{
anchors.fill: parent
ListView{
id: lvCommitsBranch
model: git.getCommitsBranch();
clip: true
delegate: Rectangle {
height: 100
width: parent.width
Text {
anchors.left: parent.left
font.bold: true
text:model.author
id:txtName
}
Text{
anchors.left: parent.left
anchors.top:txtName.bottom
font.pixelSize: 10
text:model.email
id: txtEmail
}
Text {
anchors.left: parent.left
anchors.top:txtEmail.bottom
text: model.message + ' ' + model.hash
id: txtMsg
}
MouseArea{
anchors.fill: parent
onClicked: {
lvCommitsBranch.currentIndex = index;
console.log('Msg: ' + model.message);
console.log('Hash: ' + model.hash);
}
acceptedButtons: Qt.LeftButton | Qt.RightButton
}
}
}
}
Das Problem ist, dass, wenn ich einige Elemente bewegen verschwinden (jeweils zufällig Zeit und manchmal muss ich schnell bewegen, aber nicht immer).
Wenn ich auf den Artikel klicken, die nicht verschwunden sind, bekomme ich undefined
auf alle die Eigenschaften des Modells. Wenn Mousearea des onclick
ausgelöst wird er druckt die folgende:
qml: Nachricht: undefined
qml: Hash: undefined
ich das Modell Infos von einem Verfahren erhalten (QAbstractListModel), der zurückgegeben wird von meiner git
benutzerdefinierten Komponente.
Das ist mein QAbstractListModel:
Header:
class CommitsBranch : public QAbstractListModel
{
Q_OBJECT
public:
enum Roles {
AuthorRole,
EMailRole,
MsgRole,
DateRole,
HashRole
};
explicit CommitsBranch(QObject *parent = 0);
CommitsBranch(Repository *repo);
public:
virtual int rowCount(const QModelIndex &parent) const override;
virtual QVariant data(const QModelIndex &index, int role) const override;
protected:
// return the roles mapping to be used by QML
virtual QHash<int, QByteArray> roleNames() const override;
private:
QList<Commit> m_data;
QHash<int, QByteArray> m_roleNames;
};
cav:
CommitsBranch::CommitsBranch(QObject *parent)
: QAbstractListModel(parent)
{
}
CommitsBranch::CommitsBranch(Repository *repo)
{
m_roleNames[AuthorRole] = "author";
m_roleNames[EMailRole] = "email";
m_roleNames[MsgRole] = "message";
m_roleNames[DateRole] = "date";
m_roleNames[HashRole] = "hash";
/*
here we append the m_data (QList) Items using libgit2 methods
*/
}
int CommitsBranch::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_data.count();
}
QVariant CommitsBranch::data(const QModelIndex &index, int role) const
{
// this function returns the required data
}
QHash<int, QByteArray> CommitsBranch::roleNames() const
{
return m_roleNames;
}
Und git ist nur eine Klasse, die von QObject erbt und es hat die folgende Methode:
Q_INVOKABLE QObject* getCommitsBranch();
QObject *Git::getCommitsBranch()
{
CommitsBranch* files = new CommitsBranch(repo.data());
return files;
}
Ich bekomme das gleiche Verhalten ohne Scrollview. Wenn mehr Informationen benötigt werden, werde ich diese Frage bearbeiten, danke!
EDIT: Wenn ich ein Repository mit einer Menge von commits (mehr Zeilen auf die Listview) nehmen, wird auch die Erhöhung der CacheBuffer nicht helfen, wenn ich ein wenig blättern alle Elemente verschwinden.
Das Problem wahrscheinlich von der automatischen Erstellung und Zerstörung von Delegierten, die von der Ansicht stammt, wie Sie blättern. Eine dreckige schnelle Lösung wäre es, den 'cacheBuffer' der Ansicht zu erhöhen - das ist die Anzahl der Pixel, die geladen werden sollen. Es ist bekannt, dass QML manchmal [verliert die Spur von seinen Schafen] (http://stackoverflow.com/questions/33792876/qml-garbage-collection-deletes-objects-still-in-use) sozusagen, überprüfen, ob Scrollen nicht Löschen Sie nicht versehentlich die tatsächlichen Modellelemente. – dtech
Ich habe versucht, den 'cacheBuffer' auf 100 zu erhöhen und das Problem besteht immer noch. Ich habe es wieder auf 1000 geändert und jetzt verschwinden die Elemente nicht, aber manchmal werde ich immer noch undefiniert in den Eigenschaften des Objekts (auch einige seltsame visuelle Bugs wie Text verschoben) –
Versuchen Sie ein 'Item' um das 'Rectangle' in Ihrem Delegaten zu wickeln . Wie 'delegate: Item {Rectangle {...}}' – DuKes0mE