QabstractListModelとQlistアダプタ
-
29-10-2019 - |
質問
私のアプリケーションは、から継承するタイプのいくつかのオブジェクトを保存します
QAbstractListModel
オブジェクト
これは単純な包装時にかなりの重複コードを生成します
General Addを使用したstd::vector<T>
またはQList<T>
削除と多選択機能。
はQAbstractListModel
が使用されるべきか、あるいはそこにある方法です。
重複したコードを削除できるアダプタクラス(少なくとも
QTの一部である容器)?
例:vector<ObjectA>
とvector<ObjectB>
をモデルに折り返したい。insertRows
、deleteRows
、columnCount
などのコードは常に同じになるでしょう。
解決
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_;
};
.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:
は、次のようにobjectA
とobjectB
を実装します。
class objectA : baseObject
.
と
class objectB : baseObject
.
ここでbaseObject
は次のとおりです。
struct baseObject
{
virtual std::string toString() = 0;
};
.
おそらく文字列に変換する方が簡単なこと、それ以外のもの。
PATH 2は、基本的にstd::vector<boost::any>()
を使用して、Data Storageコンテナとしてモデル内部に含まれます。
あなたがおそらく共通化することができるならばあなたがおそらく共通化することができるならば、あなたがあなたがQAbstractListModel
を返さなければならないためにあなたができることをあなたのデータの記憶域のコンテナが共通化することを考えることを考えることを考える。あなたがそれを構築することができるもの。