2009-11-03 14 views
7

Gibt es etwas Ähnliches wie das (PyQT) QTreeWidgetItem.setCheckState(0, Qt.Checked), aber für die Combobox?QComboBox in QTreeWidgetItem

Ich kann nichts in der Referenz sehen, also wie kann ich eine benutzerdefinierte QComboBox als eines der Elemente in QTreeWidgetItem einfügen?

Antwort

19

Verwenden Sie QTreeWidget::setItemWidget (QTreeWidgetItem * item, int column, QWidget * widget), um das Kombinationsfeld in die Zellen einzufügen.

Zum Beispiel wollen sie alle Zeilen der zweiten Spalte einer für alle seine Combo-Box 2-Säule QTreeWidget machen:

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

Unser Beispiel-Widget sieht nun wie folgt aus:

enter image description here

12

Ich weiß, das ist eine alte Frage, aber ich denke, ich habe eine gründlichere Antwort. Um die Funktionalität von QComboBox zu erhalten, müssen Sie wahrscheinlich eine Unterklasse erstellen. Hier ist die Lösung, die ich kam mit:


#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); 

Ich hoffe, dass jemand in der Notwendigkeit einer QComboBox innerhalb eines QTreeWidgetItem hilft!

+0

Danke, das ist viel affektive Art der Antwort, ich frage mich, wer die beste Antwort wählte !! – Orochi

+0

Nun, die Frage wurde im Jahr 2009 veröffentlicht und ich habe sie 2011 beantwortet, deshalb bin ich mir sicher, dass das der Grund ist. –

+0

:) Aber danke trotzdem .... wirklich hilfreich, wie ich Delegaten für die Ansichten zu verwenden gedacht war, aber diese Lösung ist viel einfacher – Orochi

1

Dies ist am einfachsten Methode:

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

Hier ist klein fix auf das Verfahren ein anderes Poster. Ich habe festgestellt, dass Daten verwendet wird, um die Box zu aktualisieren Wie auch immer ich kleine Änderungen an SetText Updater für die Methode vorgenommen habe.

#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

Verwenden

setItemWidget (QTreeWidgetItem(), Spalte, QWidget())

.Just Ihre QComboBox() als Parameter hinzuzufügen, wie es erbt QWidget() so es ist kompatibel.

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) 
Verwandte Themen