Qt QTreeView 可编辑 DOM 模型

发布于 2024-12-13 16:02:14 字数 969 浏览 3 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

二智少女猫性小仙女 2024-12-20 16:02:14

好吧,显然返回 QDomElementitem->node().toElement() 具有必要的“set”函数并且它可以工作。所以我想我已经找到了一种通过 QTreeView 完全修改我的 XML DOM 文件的方法。

这对我有用:

switch (index.column()){
   case 0: // added
      item->node().toElement().setTagName(value.toString());
      break;
   case 1: // added
      // this shall be modified to account for nonstandard spacings, etc.
      aux = value.toString().trimmed();
      aux.remove("\"");
      attributes.clear();
      attributes = aux.split(" ");
      for(int i = 0; i<attributes.size(); i++){
         item->node().toElement().setAttribute(attributes.at(i).split("=").at(0),
                                               attributes.at(i).split("=").at(1));
      }
      break;
   case 2: // Left it as it is
      item->node().setNodeValue(value.toString());   // This works - QTreeView is updated
      break;
}

Well, apparently item->node().toElement() which returns a QDomElement has the necessary "set" functions and it works. So I think I've found a way to fully modify my XML DOM file through QTreeView.

This does the trick for me:

switch (index.column()){
   case 0: // added
      item->node().toElement().setTagName(value.toString());
      break;
   case 1: // added
      // this shall be modified to account for nonstandard spacings, etc.
      aux = value.toString().trimmed();
      aux.remove("\"");
      attributes.clear();
      attributes = aux.split(" ");
      for(int i = 0; i<attributes.size(); i++){
         item->node().toElement().setAttribute(attributes.at(i).split("=").at(0),
                                               attributes.at(i).split("=").at(1));
      }
      break;
   case 2: // Left it as it is
      item->node().setNodeValue(value.toString());   // This works - QTreeView is updated
      break;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文