كيو تي جامبي:QAbstractListModel لا يتم عرضه في QListView
-
02-07-2019 - |
سؤال
لقد قمت بإنشاء تنفيذ ل QAbstractListModel
فئة في Qt Jambi 4.4 وأجد أن استخدام النموذج مع a QListView
يؤدي إلى عدم عرض أي شيء، ولكن باستخدام النموذج مع QTableView
يعرض البيانات بشكل صحيح.
أدناه هو تنفيذي ل QAbstractListModel
:
public class FooListModel extends QAbstractListModel
{
private List<Foo> _data = new Vector<Foo>();
public FooListModel(List<Foo> data)
{
if (data == null)
{
return;
}
for (Foo foo : data)
{
_data.add(Foo);
}
reset();
}
public Object data(QModelIndex index, int role)
{
if (index.row() < 0 || index.row() >= _data.size())
{
return new QVariant();
}
Foo foo = _data.get(index.row());
if (foo == null)
{
return new QVariant();
}
return foo;
}
public int rowCount(QModelIndex parent)
{
return _data.size();
}
}
وإليك كيفية ضبط النموذج:
Foo foo = new Foo();
foo.setName("Foo!");
List<Foo> data = new Vector<Foo>();
data.add(foo);
FooListModel fooListModel = new FooListModel(data);
ui.fooListView.setModel(fooListModel);
ui.fooTableView.setModel(fooListModel);
يمكن لأي شخص أن يرى ما أفعله خطأ؟أود أن أعتقد أنها كانت مشكلة في التنفيذ لأنه، كما يقول الجميع، لم يتم كسر التحديد!
المحلول
ليس لدي خبرة في جامبي، ولكن ألا يجب عليك إرجاع QVariant من بيانات الطريقة () بدلاً من إرجاع Foo؟ليس من الواضح بالنسبة لي كيف سيعرف العرض كيفية تحويل Foo إلى سلسلة للعرض.
أيضًا، هل هناك أي فرصة لأن أبيع لك QStandardModel وQStandardModelItem الأسهل استخدامًا بدلاً من طرح نموذج مخصص بالكامل بالطريقة الصعبة؟وإذا كنت ستحصل على عرض واحد فقط على الإطلاق، فيمكنك تجنب نمط MVC بالكامل واستخدام QListWidget سهل الاستخدام للغاية.
نصائح أخرى
يحتوي تطبيق data() الخاص بنموذجك على مشكلتين:
فشل في قيم مختلفة لأدوار بيانات العنصر المختلفة.يعيد تطبيقك الحالي نفس القيمة لجميع الأدوار ، ويمكن أن تواجه بعض المشاهدات مشاكل معها.
QVariant في Jambi ليس هو نفسه الموجود في Qt العادي.عندما لا يكون لديك ما يمكنك إرجاعه،
مجرد العودةnull
.
التنفيذ الأفضل سيكون:
public Object data(QModelIndex index, int role) {
if (index.row() < 0 || index.row() >= _data.size())
return null;
if (role != Qt.ItemDataRole.DisplayRole)
return null;
return _data.get(index.row());
}