2012-03-12 44 views
1

我正在使用QStandardItemModel與QStandardItem的。QTreeView vs setIndexWidget

我不想寫我自己的模型和任何代表。

我只是想有在第二列QComboBox'es複選框的樹...

m_model->setColumnCount(2); 
for (int i = 0; i < sectionCount; i++) 
{ 
    QStandardItem * section = new QStandardItem(tr("Section %1").arg(i+1)); 
    section->setCheckable(true); 
    section->setCheckState(Qt::Checked); 

    for (int j = 0; j < itemsCount; j++) 
    { 
     QStandardItem * item = new QStandardItem(tr("Item %1").arg(j+1)); 
     item->setCheckable(true); 
     item->setCheckState(Qt::Checked); 

     QStandardItem * item2 = new QStandardItem("xxx"); 

     section->appendRow(QList<QStandardItem*>() << item << item2); 

     QComboBox * combo = new QComboBox(); 
     QModelIndex index = m_model->index(j, 1,); 

     // HERE i have index = {-1;-1} 

     ui->treeView_options->setIndexWidget(index, combo); 
    } 
    m_model->appendRow(section); 
} 

是否有可能使用setIndexWidget這種方式?

UPDATE:

我在第二欄沒有QComboBox ...爲什麼?

回答

1

不,是行不通的:

此功能只能用於顯示對應於數據項的可視區域內的靜態內容。如果要顯示自定義動態內容或實現自定義編輯器小部件,請改爲QItemDelegate的子類。

+0

我想顯示靜態內容 – k06a 2012-03-12 14:49:19

+0

嗯......這不是我所理解的'我只是想在第二列中使用帶有QComboBox的複選框...'。靜態意味着您必須手動爲您想要的每個單元創建1個組合,與數據無關 – Koying 2012-03-12 14:55:10

+0

CheckBox的內容在編譯時固定。 – k06a 2012-03-12 14:58:14

5

這實際上是可能的。我會建議先創建一個有兩列的模型。在一行中創建項目並將其附加到模型中。只有在您添加了包含項目的行後,您纔可以使用組合框內容調用view->setIndexWidget()。它爲我工作,我有動態的內容。 ItemDelegates更復雜,我會推薦setIndexWidget() - 爲我工作得很好。

+2

我認爲你的錯誤是你正在做這個ui-> treeView_options-> setIndexWidget(index,combo);在m_model-> appendRow(section)之前; – 2012-11-05 19:46:19