在没有子项的情况下将 QStandartItem 设置为 Expandable
Set a QStandartItem as Expandable without having a child item
我正在尝试在可以位于不同计算机上的两个不同程序之间发送文件夹结构。在我的服务器上,我有一个 QFileSystemModel
,在我的客户端上,我有一个 QTreeView
,其中有一个 QStandardItemModel
作为模型。我有一个预构建的 signal/slot 系统,可以在程序之间发送 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);
}
};
我正在尝试在可以位于不同计算机上的两个不同程序之间发送文件夹结构。在我的服务器上,我有一个 QFileSystemModel
,在我的客户端上,我有一个 QTreeView
,其中有一个 QStandardItemModel
作为模型。我有一个预构建的 signal/slot 系统,可以在程序之间发送 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);
}
};