0
我已經寫了兩個QAbstractListModel子類:Qt的 - 降低2 QAbstractListModel之間重複的子類
class Model1: public QAbstractListModel {
Q_OBJECT
public:
int rowCount(const QModelIndex& parent=QModelIndex()) const;
QVariant data(const QModelIndex& index, int role) const;
void clear();
private:
QVector<Obj1*> m_items;
};
和
class Model2: public QAbstractListModel {
Q_OBJECT
public:
int rowCount(const QModelIndex& parent=QModelIndex()) const;
QVariant data(const QModelIndex& index, int role) const;
void clear();
private:
QVector<Obj2*> m_items;
};
此外,這兩個類具有狹槽AddObj(),它是依賴於使用的指針(Obj1*
或Obj2*
)。
的事情是,構造函數和析構函數是相同的,所以是rowCount
和clear
(他們做確切同樣的事情)。唯一的區別是data
和m_items
是。
減少重複的最佳策略是什麼?我試圖用一個基類:
class ModelBase: public QAbstractListModel {
Q_OBJECT
ModelBase(QObject* parent=0);
~ModelBase();
public:
virtual int rowCount(const QModelIndex& parent=QModelIndex()) const;
virtual QVariant data(const QModelIndex& index, int role) const = 0;
virtual void clear();
private:
QVector<QString*> m_items; // dummy vector
};
,然後讓其他類從中獲得:
class ModelDerived1: public ModelBase {
Q_OBJECT
public:
ModelDerived1(QObject* parent=0);
~ModelDerived1();
QVariant data(const QModelIndex& index, int role) const = 0;
private:
QVector<Obj1*> m_items;
};
的問題是,在這樣的情況下,派生類的data
功能不會被調用時,這個模型附加到視圖。
儘管如此,派生類data()
沒有調用(我把調試語句,他們從未執行)。
我在這裏做錯了什麼?
您的派生模型類中的'= 0'意味着'data'是純虛擬的並且沒有實現。你怎麼知道這個函數如果沒有實現就不會被調用? –
不幸的是,不使這個方法變爲純粹的虛擬不會改變任何東西。 – Einar
它怎麼能改變什麼?創建純虛擬方法的實現會導致編譯錯誤。如果您在編譯原始代碼時沒有看到錯誤,則說明有問題。 –