首先在UI上放置一个QTree这就不多说了。
先设置QTree:
ui->sendTreeWidget->setHeaderLabels(QStringList{"Name","Value"});//标题
ui->sendTreeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->sendTreeWidget->setStyle(QStyleFactory::create("windows"));//windows风格
connect(ui->sendTreeWidget,&QTreeWidget::customContextMenuRequested,this,&sequenceUi::slot_sendTreeWidgetMenu);//开启右击菜单模式
connect(ui->sendTreeWidget,&QTreeWidget::itemChanged,this,&sequenceUi::slot_sendItemChanged);//用于实时保存
然后再QTree上添加数据,这里以添加widget为例QLineEdit:
QTreeWidgetItem *item = new QTreeWidgetItem(QStringList{"send",data.command});
item->setIcon(0,QIcon(QString(":/new/prefix1/send.ico")));
item->setCheckState(0,data.enable? Qt::Checked:Qt::Unchecked);//选中状态
QTreeWidgetItem * commandNameItem = new
QTreeWidgetItem(QStringList{"Command",data.command});
QLineEdit * commandEdit = new QLineEdit();
commandEdit->setPlaceholderText("command name ");
commandEdit->setText(data.command);
connect(commandEdit,&QLineEdit::textChanged,[=](QString stre){
commandNameItem->setText(1,stre);
item->setText(1,stre);
});
item->addChild(commandNameItem);
ui->sendTreeWidget->setItemWidget(commandNameItem,1,commandEdit);
最后是怎么获取数据了,上面用的是信号和槽,在QLineEdit text变更时直接更改对应的QTreeWidgetItem的Text,到时需要保存数据时遍历QTree就可以了。
还有另外一种这里不设信号槽直接用dynamic()<>获取也是可以的 :
dynamic_cast<QLineEdit*>(ui->TreeWidget->itemWidget(childItem,1))->text()
QComboBox原理一样,这里就不贴图了。