2017-02-22 41 views
0

我是Qt模型/視圖編程的新手,並已閱讀Qt文檔中的Editable Tree Model Example。此示例中的一個很好的功能是,由於重寫了QModelIndex QAbstractItemModel::indexQVariant QAbstractItemModel::data,單個對象(TreeItem)封裝了後面顯示在包含兩列(namedescription)的單行中的兩條信息。現在兩個QStandardItem對象可以處理來自同一個對象的不同屬性嗎?

,我也有一個自定義類(如Foo)包含的信息(Foo::m_nameFoo::m_description)兩片,我想在包含兩列單行來顯示,但不是子類QAbstractItemModel我想繼承QStandardItemModel因爲它有很多功能。但是,似乎我必須爲我的每個Foo對象創建兩個QStandardItem對象,一個處理m_name,另一個處理m_description。我如何在內存中保留一個Foo對象並讓這兩個QStandardItem對象引用它?

在我的問題有一個必須爲每個(行,列)對創建QStandardItem對象隱含的假設。請讓我知道如果這是錯誤的。

回答

0

A post in qtcentre建議Advanced Qt Programming和LO的第4章,不料,有一棵樹subsclassing QstandardItemModelQStandardIteml在樹的每行由三個QstandardItem處理一個對象的不同屬性的討論。 實現源代碼是freely available

基本上,一個有:

class myItem : public QStandardItem { 
public: 
    myItem(Foo &afoo) : QStandardItem(afoo.getName()), m_foo(afoo) { 
    m_description = new QStandardItem(afoo.getDescription()); 
    } 
    QstandardItem *m_description; // display m_description 
private: 
    Foo &m_foo;  
}; 

,然後我們插入兩個QstandardItem一行在我們的模型樹

class myModel: public QStandardItemModel { 

    StandardItem *myModel::appendRow(QStandardItem *parent, Foo &afoo) 
    { 
     auto *doublet = new myItem(afoo); 
     parent->appendRow(QList<QStandardItem*>() << doublet 
       << double->m_description); 
     return nameItem; 
    } 
} 
0

QStandardItemModel是關於將數據存儲在模型中的,所以每個單元都由包含該單元數據的QStandardItem表示。

如果數據已經存儲在其他地方並且不應該被複制,那麼QStandardItemModel是錯誤的方法,並且定製模型是要走的路。

自定義模型(在衍生自QAbstractItemModel的樹結構的情況下)只是視圖和數據之間的接口,因此數據只在內存中駐留一次。

+0

我宣佈'Q_DECLARE_METATYPE(富* )並在'QStandardItem'中存儲'QVariant '以避免存儲'Foo'對象。然而,這仍然使我不必實例兩個'QStandardItem'對象爲每個'Foo'對象,我希望有一些設計上的解決方法。 – jmborr

+0

正如我說:'在使用QStandardItemModel'每單元一個'QStandardItem'作爲其設計原則。它的用例是將數據存儲在模型中,而不是作爲存儲在別處的數據的接口。 –

相關問題