在运行期间,我在QTreeWidget中插入了QCombobox,如下所示:
//global defines
#define COLUMN_1 (0)
#define COLUMN_2 (1)
//Init QComboBox to QTreeWidget - works fine.
QTreeWidgetItem *item = new QTreeWidgetItem(_myTreeWidget);
item->setText(COLUMN_1,"testing");
QComboBox *box = new QComboBox();
box->addItem("select1");
box->addItem("select2");
box->addItem("select3");
_myTreeWidget->setItemWidget(item, 1, box);
上面的代码有效,但我也想阅读这些列中的数据文本。例如。得到字符串"测试" &安培; " SELECT2"从上面的代码。问题是我无法弄清楚如何阅读" QComboBox :: currentText()"在组合框中。 我试过了:
QTreeWidgetItemIterator it(_myTreeWidget);
while(*it)
{
QTreeWidgetItem *item = *it;
QVariant first = item->text(COLUMN_1);
QString firstStr = loggerName.toString(); //this works
QComboBox *box = (QComboBox*)item->data(COLUMN_2, 0);
QString boxValStr = box->text().toString(); //this doesn't works, always empty string
//... more code to handle strings...
it++;
}
感觉像" item->数据(COLUMN_2,0)"是错误的方式,因为它返回一个QVariant。 解决这个问题?
答案 0 :(得分:4)
QComboBox *box = (QComboBox*)item->data(COLUMN_2, 0);
当我读到这段代码时,我进入了恐慌模式。签名:
QVariant QTreeWidgetItem::data ( int column, int role ) const
当您使用setItemWidget
时,您应该使用
QWidget * QTreeWidget::itemWidget ( QTreeWidgetItem * item, int column ) const
ps:如果要进行强制转换,请使用C ++强制转换。更好的是,qobject_cast<SubtypeofQObjectPtr>
使用QObject
。当演员表无效时,它返回null。
实际上,我的意思是使用类似于:
的调用来检索组合框QComboBox* box = qobject_cast<QComboBox*>(treeWidget->itemWidget(item, column));
答案 1 :(得分:2)
感谢上面@Umnyobe和@Zaiborg的帮助。这是一个完整的工作示例:
使用column1中的文本和第2列中的QComboBox初始化QTreeWidget:
//global defines
#define COLUMN_1 (0)
#define COLUMN_2 (1)
QTreeWidgetItem *item = new QTreeWidgetItem(_myTreeWidgetPtr);//item to put in tree
item->setText(COLUMN_1,"animal"); //item for column 1 in the tree.
QComboBox *box = new QComboBox();
box->addItem("mouse"); //adds selections for comboboxes
box->addItem("cat");
box->addItem("dog");
_myTreeWidgetPtr->setItemWidget(item, COLUMN_2, box); //insert items in tree.
从树中读取值:
QTreeWidgetItemIterator it(_myTreeWidgetPtr);
while(*it)
{
QTreeWidgetItem *item = *it;
//Init pointer to current combobox
QComboBox* box = qobject_cast<QComboBox*>(_myTreeWidgetPtr->itemWidget(item, COLUMN_2));
//Get data from QTreeWidget
QString col1Str = item->text(COLUMN_LOGGER);
QString col2Str = box->currentText();
it++;
}
希望它可以帮助某人:)
答案 2 :(得分:0)
使用QSignalMapper
类来收集treewidget中的不同框。
然后将QSignalMapper::mapped()
信号连接到某个插槽并使用组合框
编辑:
QSignalMapper* mapper = new QSignalMapper(this);
QComboBox *box = new QComboBox();
connect( box, SLOT(/*whatever*/), mapper, SLOT( map() ) );
mapper->setMapping( box );
myTreeWidget->setItemWidget(item, 1, comboBox);
答案 3 :(得分:0)
对于正在寻找Python解决方案的任何人, (QTreeWidget中的PySide / PyQt QComboBox),这是它:
item = QTreeWidgetItem(self.treeWidgetAnimals)
item.setText(0, "animal")
combo_box = QComboBox()
combo_box.addItem('mouse')
combo_box.addItem('cat')
combo_box.addItem('dog')
self.treeWidgetAnimals.setItemWidget(item, 1, combo_box)
我正在寻找几个小时,但没有其他论坛像传递参考“父母”像“代表团”:
item = QTreeWidgetItem (self.myTreeWidgetItemObject)
如果您没有传递父级,则不会返回错误,但ComboBox不会出现在显示TreeWidget中。