Deliriyorum. ScrollView içinde bir ListView var, QAbstractListModel devralan bir modele bağladım. Nesne modele eklendiğinde, ListView bir temsilci kullanarak bunları gösterir. Çok uzak çok iyi.QML ListView yöntem positionViewAtEnd() tam olarak tersi yapar
Ama gerçekten görünümü (sohbet penceresinin gibi) altına kaydırılacağı halde kalmasını istiyorsanız, ve bunun olmasına yapma çok zor zamanlar geçiriyorum. ,
Rectangle {
ScrollView {
[anchor stuff]
ListView {
id: messageList
model: textMessageFiltered
delegate: messageDelegate
}
}
TextField {
id: messageEditor
[anchor stuff]
onAccepted: {
controller.sendTextMessage(text)
text = ""
/* This works. */
//messageList.positionViewAtEnd();
}
}
Component {
id: messageDelegate
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
color: "white"
height: nameText.height + 4
Text {
id: nameText
wrapMode: Text.Wrap
text: "<b>" + authorName + " (" + authorId + ")</b> " + message
[anchor stuff]
}
ListView.onAdd: {
console.log("This prints just fine!")
messageList.positionViewAtEnd()
}
}
}
}
gerçekten garip bir şey messageList.positionViewAtEnd()
(dosyanın sonunda) aslında başından onu atlar şudur: Burada, ilgili QML kodudur. Arama olmadan, listede yeni girişler görünse bile görünüm nerede kalır. Eğer Qt documentation for the ListView.positionViewAtEnd() bakarsak Gerçekten de, diyor: de
Bu bir aptal hata içinde belgeler, ya da ne? Bu çalışmayı yapmak için düşünebildiğim her şeyi, özellikle dePozisyonlar görünümü başlayan veya sona dikkate alarak ...
positionViewAtIndex()
yöntemini denedim ve kaydırma işleminin gerçekleşmesini zorlamak için vurgulayıcıları kullanıyorum. Ama hiçbir şey işe yaramıyor. Yukarıdaki kaynak kodunda bulunan
/* This works. */
yorumuna dikkat edin. Bu etkin olduğunda, tamamen iyi çalışıyor!
kimse burada yanlış olabilir bir fikrin var mı - (yerine listenin sonu, 2 indeksi elbette hariç, bu ListView.count() atlar)? Herhangi bir örnekte, QML'de korkunç, korkunç bir hata olduğunu kanıtlamaya çalışabilir miyim?
Ben QtQuick 2.0 ile Qt 5.3.1 kullanıyorum (veya 2.1 veya 2.2 de başarısız). Birçok diğer yapılandırmayı ve kodu da denedim, bu yüzden daha fazla bilgiye ihtiyacınız olup olmadığını sorun. Google-fu'mı tamamen tükettim.
Teşekkürler! Kabul yanıt yukarıda sorunu çözmek yok iken
düzenleme 1
, bu temsilciye Component.onCompleted
eklenmektedir. Bu, listeyi kaydırdığınızda sorunlara neden oluyor, çünkü (ben inanıyorum) delege, yukarı kaydırdığınızda görünümüne eklenir, model öğesi yeni olmasa bile onCompleted tetikleyicinin çağrılmasına neden olur. Bu çok istenmeyen bir durumdur. Aslında, yukarı kaydırmaya çalıştığımda ve listeye yeni öğeler eklediğinde uygulama donuyor. Ben kaydırma tetiklemek için bir temsilci örneği varlığını kullanmak yerine bir model.onAdd() sinyali gerekiyor gibi
görünüyor. Herhangi bir fikir?
Düzenleme 2
Ve nasıl olacak bu iş DEĞİLDİR?
ListView {
id: messageList
model: textMessageFiltered
delegate: messageDelegate
onCountChanged: {
console.log("This prints properly.")
messageList.positionViewAtEnd()
}
}
"Bu doğru yazdırılıyor" metni yazdırılıyor, bu yüzden neden konumu yok? Aslında, konumu en üste sıfırlar. Bu yüzden positionViewAtBeginning()
'u denedim, ama aynı şeyi yaptı.
Tamamen stumped. Bir böcek gibi hissettiriyor.
? Bu benim için Ubuntu üzerinde Qt 5.4 kullanarak çalışır (görebildiğim kadarıyla değil, doğru sayılır - 2). Kaydırma ve onCountChanged çalışmadığında ortaya çıkan asmak için lütfen bir hata raporu oluşturun. – Mitch
sorun üzerinde (öğe anında (gerçek öğe bir sunucu isteğinden eklenir) listesine eklenir değildir ve bu nedenle bu ya biri olarak kapalıdır (gönderici üzerine) veya hiç güncelleme olmamasıdır diğer müşteri). PositionViewAtBeginning() '_must_, güncellenmekte olan listenin üzerinde hareket eder. Kötü bir hata isteği gönderdim (QTBUG-41571), bu yüzden bu gönderi sorunu açıklığa kavuşturmak için yeterlidir. – jmbeck
Sorunu çözmeyi başardınız mı? Tam problemim var ve herhangi bir çözüm bulamıyorum. Teşekkürler! –