2013-07-28 21 views
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*)。

的事情是,構造函數和析構函數是相同的,所以是rowCountclear(他們做確切同樣的事情)。唯一的區別是datam_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

您的派生模型類中的'= 0'意味着'data'是純虛擬的並且沒有實現。你怎麼知道這個函數如果沒有實現就不會被調用? –

+0

不幸的是,不使這個方法變爲純粹的虛擬不會改變任何東西。 – Einar

+0

它怎麼能改變什麼?創建純虛擬方法的實現會導致編譯錯誤。如果您在編譯原始代碼時沒有看到錯誤,則說明有問題。 –

回答

-1

編輯:解決方案不是我在這裏發佈的。事實上,它完全是關閉的。問題出在功能rowCount和私人m_itemsQVector

rowCount,如果不存在,調用超類方法,它不從派生的類使用私有m_items元件,但它使用從超類,這是虛設,總是返回一個大小爲0的一個,因此data永遠不會被調用。