2009-11-03 30 views
7

(PyQT) QTreeWidgetItem.setCheckState(0, Qt.Checked)に似ていますが、コンボボックスはありますか?QTreeWidgetItem内のQComboBox

QTreeWidgetItem内の要素の1つとしてカスタムQComboBoxを挿入するにはどうすればいいですか?

答えて

19

QTreeWidget::setItemWidget (QTreeWidgetItem * item, int column, QWidget * widget)を使用して、コンボボックスをセルに配置します。例えば

、のすべてに2列QTreeWidgetの2列目のすべての行は、コンボボックスも作ってみましょう:

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

私たちの例のウィジェットは、次のようになります。

enter image description here

12

これは古い質問ですが、私はもっと徹底的な答えがあると思います。 QComboBoxから機能を取得するには、おそらくそれをサブクラス化する必要があります。私はそれがQTreeWidgetItemの内部QComboBoxを必要としている誰かを役に立てば幸い


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

:ここで私が思いついた解決策です!ここで

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

ありがとう、これは多くの感情的な答えの方法です、私は誰が最良の答えを選んだのだろうか! – Orochi

+0

質問は2009年に返されました。私は2011年にそれに答えましたので、それは確かです。 –

+0

:)しかし、とにかく感謝します。私はビューの代理人を使用することを考えていたので、実際に役立ちましたが、このソリューションはずっと簡単です – Orochi

1

これが最も簡単な方法です。私はそれがデータを使用してボックスを更新する方法を発見しました。これまでメソッドのsetTextアップデータに小さな変更を加えました。そう

#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

は別ポスター方法に小さな修正です:

0

使用

setItemWidget(QTreeWidgetItem()、コラム、QWidgetの())

.Justは(あなたのQComboBoxを追加)をパラメータとして、それはQWidgetのを(継承など)それは互換性があります。

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)