问题描述
我正在尝试在可以位于不同计算机上的两个不同程序之间发送文件夹结构。在我的服务器上,我有一个 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);
}
是否有一种解决方法可以在不添加虚拟子项的情况下添加展开按钮?
亲切的问候
解决方法
我认为最好的办法是覆盖 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);
}
};