#c #qt #qtreeview #qfilesystemmodel #qstandarditem
Вопрос:
я пытаюсь отправить структуру папок между двумя разными программами, которые могут находиться на разных компьютерах. На моем сервере у меня есть a QFileSystemModel
, а на моем клиенте у меня есть a QTreeView
, у которого есть a 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);
}
Есть ли обходной путь для добавления кнопки расширения без добавления фиктивного дочернего элемента?
С уважением
Ответ №1:
Я думаю, что вашим лучшим выбором было бы переопределить QStandardItemModel::hasChildren
…
class item_model: public QStandardItemModel {
using super = QStandardItemModel;
public:
virtual bool hasChildren (const QModelIndex amp;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);
}
};