سؤال

هل هناك شيء مشابه ل (PYQT)QTreeWidgetItem.setCheckState(0, Qt.Checked) ولكن بالنسبة إلى مربع التحرير والسرد؟

لا أستطيع أن أرى أي شيء في المرجع، فكيف يمكنني إدراج QCombobox مخصص كواحد من العناصر داخل qtreewidgetitem؟

هل كانت مفيدة؟

المحلول

يستخدم qtreewidget :: setitemwidget (qtreeewidgetitem * البند، العمود الدولي، qwidget * القطعة) لوضع مربع التحرير والسرد في الخلايا.

على سبيل المثال، دعونا نجعل جميع صفوف العمود الثاني من 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;
}

مثالنا Widget يبدو الآن مثل هذا:

enter image description here

نصائح أخرى

أعلم أن هذا سؤال قديم لكنني أعتقد أن لدي إجابة أكثر شمولا. للحصول على أي وظيفة من 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 داخل qtreewidgetitem!

هذه أسهل طريقة:

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

هنا هو إصلاح صغير بطريقة ملصقات أخرى. لقد وجدت أن هذا يستخدم بيانات لتحديث المربع كم من أي وقت مضى قمت بتغيير صغير في محدث 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);

يستخدم

setitemwidget (qtreewidgetitem ()، العمود، qwidget ())

. لم يقم بإضافة 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top