質問

私のアプリケーションは、から継承するタイプのいくつかのオブジェクトを保存します QAbstractListModelオブジェクト

これは単純な包装時にかなりの重複コードを生成します General Addを使用したstd::vector<T>またはQList<T> 削除と多選択機能。

QAbstractListModelが使用されるべきか、あるいはそこにある方法です。 重複したコードを削除できるアダプタクラス(少なくとも QTの一部である容器)?

例:vector<ObjectA>vector<ObjectB>をモデルに折り返したい。insertRowsdeleteRowscolumnCountなどのコードは常に同じになるでしょう。

役に立ちましたか?

解決

C ++へのQTの拡張(信号、スロットなど)がテンプレートでうまく機能しないため、2つの別々のクラスでこれを行う必要があります。これに対する根拠と回避策は、 http://doc.qtです。digia.com/qq/qq15-academic.html

解決策の大まかな概要です。(これは私たちのアプリケーションで私たちが使用しているコードに基づいています、そしてうまく機能しています。)

1。qt stuff の抽象リストクラス

class FooListModelQt : public QAbstractTableModel {
  Q_OBJECT

public:
  // Non-template methods, signals, slots, etc. can be used here. For example...
  QSet<int> SelectedRows() const;
  // ... etc. ...

signals:
  void SelectionChanged();
  // ... etc. ...

protected:
  explicit FooListModelQt(QObject *parent = NULL);
  virtual ~FooListModelQt() = 0;
  // ... etc. ...

};
.

2。テンプレートをする抽象クラス

template <typename T>
class FooListModel : public FooListModelQt {
public:
  const T* at(int index) const { return items_.at(index); }
  int count() const { return items_.count(); }
  void Append(T *item);
  // ... etc. ...

protected:
  explicit FooListModel(QObject *parent = NULL);
  virtual ~FooListModel();

private:
  QList<T*> items_;
};
.

3。実リストクラス

class BarListModel : public FooListModel<Bar> {
  Q_OBJECT

public:
  explicit BarListModel(QObject *parent = NULL);
  int columnCount(const QModelIndex &parent) const;
  QVariant data(const QModelIndex &index, int role) const;
  // ... etc. ...
};
.

他のヒント

通常、QAbstractItemModelから直接継承し、data()などのプレゼンテーション関数の実装を実装してモデルを提供します。

QList<T>std::vector<T>を使用するためのコード重複がある場合は、次のいずれかを実行して1つを他方に変換することをお勧めします。

QList<T> list = QList::fromVector(QVector::fromStdVector(vector));
.

またはその他の方法。

std::vector<T> vector = qlist.toVector().toStdVector();
.

私は後者をやりますが、どちらかを選ぶことができます。

あなたの追加のコメントに基づいてあなたが取ることができる2つの行動の道をいくつかあります:

パス1:

は、次のようにobjectAobjectBを実装します。

class objectA : baseObject
.

class objectB : baseObject
.

ここでbaseObjectは次のとおりです。

struct baseObject
{
    virtual std::string toString() = 0;
};
.

おそらく文字列に変換する方が簡単なこと、それ以外のもの。

PATH 2は、基本的にstd::vector<boost::any>()を使用して、Data Storageコンテナとしてモデル内部に含まれます。

あなたがおそらく共通化することができるならばあなたがおそらく共通化することができるならば、あなたがあなたがQAbstractListModelを返さなければならないためにあなたができることをあなたのデータの記憶域のコンテナが共通化することを考えることを考えることを考える。あなたがそれを構築することができるもの。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top