0

我正在尝试在可以位于不同计算机上的两个不同程序之间发送文件夹结构。在我的服务器上我有一个QFileSystemModel,在我的客户端上我有QTreeView一个QStandardItemModel作为模型的。而且我有一个可以在程序之间发送QString和发送的预构建信号/插槽系统。QStringList

客户:

auto *m_stdItemModel = new QStandardItemModel(this);

auto *m_treeView = new QTreeView(this);
m_treeView->setModel(m_stdItemModel);

每次单击客户端上的展开按钮时,我都想从服务器发送子目录m_treeView。问题是条目只有在有子项时才能扩展。

我这样做的方法是添加一个虚拟孩子并在用户单击展开按钮时将其删除。

添加假人:

void addChildToParent(QString child, QStandardItem *parentItem, bool isExpandable)
{
    auto *childItem = new QStandardItem(child);

    if(isExpandable)
    {
        childItem->appendRow(new QStandardItem("dummy"));
    }

   parentItem->appendRow(childItem);
}

是否有一种解决方法可以在不添加虚拟孩子的情况下添加展开按钮?

亲切的问候

4

1 回答 1

1

我认为你最好的选择是覆盖QStandardItemModel::hasChildren......

class item_model: public QStandardItemModel {
  using super = QStandardItemModel;
public:
  virtual bool hasChildren (const QModelIndex &parent = QModelIndex()) const override
    {
      if (const auto *item = itemFromIndex(parent)) {

        /*
         * Here you need to return true or false depending on whether
         * or not any attached views should treat `item' as having one
         * or more child items.  Presumably based on the same logic
         * that governs `isExpandable' in the code you've shown.
         */
        return is_expandable(item);
      }
      return super::hasChildren(parent);
    }
};
于 2021-06-08T12:03:14.237 回答