一. QTreeWidget设置可编辑

connect(m_tree,itemChanged(QTreeWidgetItem*,int),this,SLOT(saveModify(QTreeWidgetItem*,int));

QTreeWidgetItem *item=new QTreeWidgetItem(m_tree);
item->setText(0,"hello");
item->setFlags(item->flags()|Qt::ItemIsEditable); // 设置可编辑属性

   上面这种方式,当子节点编辑完成时,如果节点文本值仍然为hello, 不能触发saveModify槽. 因为子节点文本值没有改变,不能很好的表现编辑完成后这一动作. MVC里提供了对QTableWidget的模型QAbstractTabelModel的支持,但是却没有提供对树形结构的模型支持,看来此路不通. 

 

二. 利用QLineEdit来实现编辑完成后动作

      只有QLineEdit和QAbstracSpinBox支持editingFinished()信号, 因此我们可以在树形结构中通过setItemWidget()来设置QLineEdit组件

// 添加子节点
void TreeEdit::addNode()
{
QTreeWidgetItem *curItem=m_tree->currentItem();
QTreeWidgetItem *newItem=new QTreeWidgetItem(curItem);

// 添加子节点
curItem->addChild(newItem);

// 使用QTextEdit的信号
QLineEdit *lineEdit=new QLineEdit(this);
connect(lineEdit,SIGNAL(editingFinished()),this,SLOT(finishEdit()));

// 设置widget
m_tree->setItemWidget(newItem,0,lineEdit);
m_tree->expandItem(curItem);

// 选中项
m_tree->setCurrentItem(newItem);

// 设置默认值
lineEdit->setText("default");
lineEdit->setSelection(0,7);
}

// 编辑完成后对应的槽函数
void TreeEdit::finishEdit()
{
// 编辑完成后,移除widget,还原树
QTreeWidgetItem *curItem=m_tree->currentItem();
QLineEdit *edit=qobject_cast<QLineEdit*>(m_tree->itemWidget(curItem,0));
if(!edit)
return;

QString text=edit->text();

// 移除widget
m_tree->removeItemWidget(curItem,0);

// 还原值
curItem->setText(0,text);
}

   运行效果如下: