Qt QTreeView 可编辑 DOM 模型
我有一个 QTreeView,我为其设置了子类 DomModel:QAbstractItemModel。每个项目都是一个 DomItem,主要处理 QDomNode。我将 QDomDocument 设置为该模型。我想我是从 Qt 示例之一派生出这个系统的。
它有 3 列:0 为节点名称,1 为属性,2 为值。
不管怎样,我想让这个 XML DOM 树可编辑。我修改了模型类中的一些标志,例如 Qt::ItemIsEditable 和其他一些内容,现在我可以通过双击来通过 QTreeView 编辑模型。
对于第 2 列,这很容易,因为 QDomItem 有这个 setNodeValue 函数,但是我发现 item->node().NodeName() 和 item->node().attributes() 没有“设置”函数我认为会修改第 0 列和第 1 列。
所以现在当我修改第 2 列时它可以工作,但是按 Enter 键后第 0 列和第 1 列将恢复为之前的值。
bool DomModel::setData(const QModelIndex &index, const QVariant &value,
int role)
{
if (role != Qt::EditRole) return false;
DomItem *item = static_cast<DomItem*>(index.internalPointer());
switch (index.column()){
case 0:
// ???
break;
case 1:
// ???
break;
case 2:
item->node().setNodeValue(value.toString()); // This works - QTreeView is updated
break;
}
...
}
I have a QTreeView to which I set a subclassed DomModel:QAbstractItemModel. Each item is a DomItem which deals mostly with QDomNode. I set QDomDocument to this model. I think I've derived this system from one of the Qt examples.
It has 3 columns: 0 for node name, 1 for attributes and 2 for value.
Anyway, I wanted to make this XML DOM tree editable. I've modified some flags such as Qt::ItemIsEditable and some other things in the model class and now I can edit the model through QTreeView by double clicking.
For column 2 it's easy, since QDomItem has this setNodeValue function, however I've found there are no "set" functions for item->node().NodeName() and item->node().attributes() which would, I presume, modify columns 0 and 1.
So now when I modify column 2 it works, however columns 0 and 1 revert to their previous values upon pressing enter.
bool DomModel::setData(const QModelIndex &index, const QVariant &value,
int role)
{
if (role != Qt::EditRole) return false;
DomItem *item = static_cast<DomItem*>(index.internalPointer());
switch (index.column()){
case 0:
// ???
break;
case 1:
// ???
break;
case 2:
item->node().setNodeValue(value.toString()); // This works - QTreeView is updated
break;
}
...
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好吧,显然返回
QDomElement
的item->node().toElement()
具有必要的“set
”函数并且它可以工作。所以我想我已经找到了一种通过QTreeView
完全修改我的XML DOM
文件的方法。这对我有用:
Well, apparently
item->node().toElement()
which returns aQDomElement
has the necessary "set
" functions and it works. So I think I've found a way to fully modify myXML DOM
file throughQTreeView
.This does the trick for me: