Установите QStandartItem как расширяемый без наличия дочернего элемента

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