1

QAbstractListModelQt Jambi 4.4 でクラスの実装を作成しましたが、モデルを使用する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);

誰かが私が間違っていることを見ることができますか? 誰もが言うように、 select は壊れていないので、実装に問題があったと思います!

4

2 に答える 2

1

モデルのdata()実装には、次の2つの問題があります。

  • アイテムデータの役割ごとに値を変えることはできません。現在の実装はすべての役割に対して同じ値を返し、一部のビューでは問題が発生する可能性があります。

  • ジャンビのQVariantは、通常の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());
}
于 2009-10-04T22:43:13.390 に答える
1

私はジャンビの経験はありませんが、Fooを返す代わりに、メソッドdata()からQVariantを返すべきではありませんか?ビューがFooを表示用の文字列に変換する方法をどのように認識しているかは私にはわかりません。

また、完全にカスタム化されたものを難しい方法でロールする代わりに、使いやすいQStandardModelとQStandardModelItemを販売できる可能性はありますか?また、ビューが1つしかない場合は、MVCパターン全体を完全に回避し、非常に使いやすいQListWidgetを使用することができます。

于 2008-09-24T23:40:33.227 に答える