2009-11-03 6 views
7

Czy jest coś podobnego do (PyQT) QTreeWidgetItem.setCheckState(0, Qt.Checked), ale dla pola kombi?QComboBox wewnątrz QTreeWidgetItem

Nic nie widzę w odnośniku, więc jak mogę wstawić niestandardowy QComboBox jako jeden z elementów w QTreeWidgetItem?

Odpowiedz

19

Aby umieścić pole kombi w komórkach, użyj QTreeWidget::setItemWidget (QTreeWidgetItem * item, int column, QWidget * widget).

Na przykład, zróbmy wszystkie wiersze drugiej kolumnie 2-kolumnowej QTreeWidget wszystkim być kombi polach:

QTreeWidgetItemIterator it(ui->treeWidget); 
while (*it) { 
    QComboBox *comboBox = new QComboBox(this); 
    comboBox->addItems(QStringList() << "item1" << "item2"); 
    ui->treeWidget->setItemWidget(*it, 1, comboBox); 
    ++it; 
} 

Nasz przykład widżet teraz wygląda tak:

enter image description here

12

Wiem, że to stare pytanie, ale myślę, że mam bardziej szczegółową odpowiedź. Aby uzyskać dowolną funkcjonalność z QComboBox, prawdopodobnie będziesz musiał ją podklasować. Oto rozwiązanie, które wymyśliłem:


#ifndef COMBOBOXITEM_H 
#define COMBOBOXITEM_H 

#include 

class ComboBoxItem : public QComboBox 
{ 
    Q_OBJECT 

private: 
    QTreeWidgetItem *item; 
    int column; 

public: 
    ComboBoxItem(QTreeWidgetItem*, int); 

public slots: 
    void changeItem(int); 

}; 

ComboBoxItem::ComboBoxItem(QTreeWidgetItem *item, int column) 
{ 
    this->item = item; 
    this->column = column; 
    connect(this, SIGNAL(currentIndexChanged(int)), SLOT(changeItem(int))); 
} 

void ComboBoxItem::changeItem(int index) 
{ 
    if(index >=0) 
    { 
     item->setData(this->column, Qt::UserRole, this->itemText(index)); 
     qDebug() item->data(this->column, Qt::UserRole).toString(); 
    } 
} 

#include "moc_ComboBoxItem.cpp" 

#endif // COMBOBOXITEM_H 

////// Sample implementation.. 

lst = new QTreeWidget; 
// Snip 
QTreeWidgetItem *itm = new QTreeWidgetItem; 
// Snip 
ComboBoxItem *cmb = new ComboBoxItem(itm, 1); 
cmb->addItem("One"); 
cmb->addItem("Two"); 
cmb->addItem("Three"); 
cmb->addItem("Four"); 
lst->setItemWidget(itm, 1, cmb); 

Mam nadzieję, że ktoś pomoże w potrzebie QComboBox wewnątrz z QTreeWidgetItem!

+0

Dzięki, to jest bardzo emocjonalny sposób odpowiadania, zastanawiam się, kto wybrał najlepszą odpowiedź! – Orochi

+0

Cóż, pytanie zostało opublikowane w 2009 r., A ja odpowiedziałem na to w 2011 r., Więc jestem pewien, że właśnie dlatego. –

+0

:) Ale dzięki i .... naprawdę pomocne, ponieważ myślałem o użyciu delegatów do poglądów, ale to rozwiązanie jest znacznie łatwiejsze – Orochi

1

Jest to najprostsza metoda:

QComboBox *cb = new QComboBox(this); 
QStringList cbTexts; 
cbTexts << tr("First") << tr("Second") << tr("Third"); 
cb->addItems(cbTexts); 

QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget); 
ui->treeWidget->addTopLevelItem(item); 
ui->treeWidget->setItemWidget(item, [colum here], cb); 
for (int col = 0; col < [num colums]; ++col) ui->treeWidget->resizeColumnToContents(col); 
0

Oto mała poprawka do sposobu kolejne plakaty. Znalazłem, że używa danych do aktualizacji okna Jak tylko wprowadziłem małą zmianę w metodzie setText dla tej metody.

#ifndef COMBOBOXITEM_H 
#define COMBOBOXITEM_H 

#include <QtGui> 

class ComboBoxItem : public QComboBox 
{ 
    Q_OBJECT 

private: 
    QTreeWidgetItem *item; 
    int column; 

public: 
    ComboBoxItem(QTreeWidgetItem*, int); 

public slots: 
    void changeItem(int); 

}; 

ComboBoxItem::ComboBoxItem(QTreeWidgetItem *item, int column) 
{ 
    this->item = item; 
    this->column = column; 
    connect(this, SIGNAL(currentIndexChanged(int)), SLOT(changeItem(int))); 
} 

void ComboBoxItem::changeItem(int index) 
{ 
    if(index >=0) 
    { 
     this->item->setText(this->column, this->currentText()); 

    } 
} 

#include "moc_ComboBoxItem.cpp" 



#endif // COMBOBOXITEM_H 

////// Sample implementation.. 

lst = new QTreeWidget; 
// Snip 
QTreeWidgetItem *itm = new QTreeWidgetItem; 
// Snip 
ComboBoxItem *cmb = new ComboBoxItem(itm, 1); 
cmb->addItem("One"); 
cmb->addItem("Two"); 
cmb->addItem("Three"); 
cmb->addItem("Four"); 
lst->setItemWidget(itm, 1, cmb); 
0

Zastosowanie

setItemWidget (QTreeWidgetItem(), kolumna, QWidget())

.Just dodać QComboBox() jako parametr, ponieważ dziedziczy QWidget() tak jest kompatybilny.

tree = QTreeWidget() 

cmb = QComboBox() 
cmb.addItem("Item1", 'value1') 
cmb.addItem("Item2", 'value2') 
cmb.addItem("Item3", 'value3') 

item = QTreeWidgetItem(tree.invisibleRootItem()) 
column = 0 
item.setData(column, Qt.EditRole, 'NameYouWant') 
column += 1 
tree.setItemWidget(item, column , cmb)