代码之家  ›  专栏  ›  技术社区  ›  Piotr Byzia

QTreeWidgetItem内的QComboBox

  •  8
  • Piotr Byzia  · 技术社区  · 16 年前

    有类似于(PyQT)的东西吗 QTreeWidgetItem.setCheckState(0, Qt.Checked)

    我在引用中看不到任何内容,因此如何在QTreeWidgetItem中插入自定义QComboBox作为元素之一?

    5 回复  |  直到 7 年前
        1
  •  26
  •   sashoalm Yaser Kalali    10 年前

    使用 QTreeWidget::setItemWidget ( QTreeWidgetItem * item, int column, QWidget * widget ) 将组合框放入单元格。

    例如,让我们将2列QTreeWidget第二列的所有行都设置为组合框:

    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

        2
  •  15
  •   user336063 user336063    15 年前

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

    我希望这能帮助那些需要QTreeWidgetItem中的QComboBox的人!

        3
  •  1
  •   Garjy    10 年前

    使用

    setItemWidget(QTreeWidgetItem(),列,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)
    
        4
  •  0
  •   Jeroi    12 年前

    下面是另一个方法的小补丁。我发现is使用数据来更新框,而我对方法的setText updater做了一些小更改。

    #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);
    
        5
  •  0
  •   manuel    11 年前

    这是最简单的方法:

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