2009-11-03 21 views
7

¿Hay algo similar a (PyQT) QTreeWidgetItem.setCheckState(0, Qt.Checked) pero para el cuadro combinado?QComboBox dentro de QTreeWidgetItem

No puedo ver nada en la referencia, entonces, ¿cómo puedo insertar un QComboBox personalizado como uno de los elementos dentro de QTreeWidgetItem?

Respuesta

19

Usa QTreeWidget::setItemWidget (QTreeWidgetItem * item, int column, QWidget * widget) para poner el cuadro combinado en las celdas.

Por ejemplo, vamos a hacer todas las filas de la segunda columna de un 2 columnas QTreeWidget a todos los cuadros combinados ser:

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

nuestro widget ejemplo, ahora se ve así:

enter image description here

12

Sé que esta es una vieja pregunta, pero creo que tengo una respuesta más completa. Para obtener cualquier funcionalidad de QComboBox, es probable que deba subclasificarla. Aquí está la solución que se me ocurrió:


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

Espero que ayude a alguien en necesidad de un QComboBox en el interior de un QTreeWidgetItem!

+0

Gracias, esta es una manera muy afectiva de responder, me pregunto quién eligió la mejor respuesta !! – Orochi

+0

Bueno, la pregunta fue publicada en 2009 y la contesté en 2011, así que estoy seguro de por qué. –

+0

:) Pero gracias de todos modos ... realmente útil ya que estaba pensando en usar delegados para las vistas, pero esta solución es mucho más fácil – Orochi

1

Este es el método más fácil:

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

Aquí es pequeño arreglo al método de otros carteles. Descubrí que se usa Datos para actualizar el cuadro. ¿Alguna vez hice un pequeño cambio en el actualizador setText para el método?

#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

Uso

setItemWidget (QTreeWidgetItem(), columna, QWidget())

.just añada su QComboBox() como un parámetro, ya que hereda QWidget() por lo es compatible

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) 
Cuestiones relacionadas