将QStandartItem设置为可扩展,但不包含子项



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

客户:

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);
}

有没有一种变通方法可以在不添加虚拟子项的情况下添加扩展按钮?

问候

我认为您最好的选择是覆盖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);
}
};

最新更新