سؤال

لقد قمت بإنشاء تنفيذ ل 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());
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top