Frage

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

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

War es hilfreich?

Lösung

Verwenden Sie QTreeWidget :: setItemWidget (QTreeWidgetItem * item, int Spalte, QWidget * widget ) das Kombinationsfeld in die Zellen zu bringen.

Zum Beispiel, lassen Sie sich alle Zeilen der zweiten Spalte eines 2-Säulen-QTreeWidget macht für alle Kombinationsfelder sein:

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:

 image description hier

Andere Tipps

Ich weiß, das ist eine alte Frage, aber ich glaube, ich habe eine gründlichere Antwort. Um jegliche Funktionalität zu erhalten aus dem QComboBox, werden Sie wahrscheinlich brauchen sie Unterklasse. 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 hilft innerhalb eines QTreeWidgetItem!

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

Hier ist klein fix auf die anderen Poster-Methode. Ich fand, dass Daten wird verwendet um das Feld zu aktualisieren Wie immer ich kleine Änderung an setText Updater für die Methode.

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

Mit

  

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

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

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top