QTreeview не обновляется правильно, когда элементы добавляются в корень

У меня есть древовидное представление, которое должно отображать содержимое собственного набора данных для достижения этой цели. Я реализовал новую модель для древовидного представления. Когда я добавляю объект в любой родительский элемент, все работает нормально, и новый элемент отображается в представлении, но когда я пытаюсь добавить элемент в корневой элемент, этот элемент не отображается до тех пор, пока я не добавлю объект в другой родительский элемент или я сбросить модель.

Мой метод добавления строк в модель выглядит так:

bool TreeModel::insertRows(int row, int count, const QModelIndex &parent, DataObject *object, QString name, QString path)
{
  if (!parent.isValid())
     return false;

  DataCollection* dataCollection = static_cast<DataCollection*>(parent.internalPointer());

  beginInsertRows(parent, dataCollection->Size(), dataCollection->Size());
  dataCollection->AddData(object, name.toStdString(), path.toStdString());
  endInsertRows();


  return true;
}

Как я могу добиться обновления представления при добавлении элемента в корневой элемент?


person miaupaurr    schedule 29.04.2014    source источник


Ответы (2)


Вы не используете beginInsertRows в хорошем смысле:

void QAbstractItemModel::beginInsertRows(const QModelIndex & parent, int first, int last)

Но вы передаете вдвое больше предметов: мне это кажется странным. В любом случае, если ваша модель является подклассом QStandardItemModel (а не QAbstractItemModel), есть очень удобный метод, который вы можете использовать:

QStandardItem * QStandardItemModel::invisibleRootItem() const

Из документации:

Возвращает невидимый корневой элемент модели. Невидимый корневой элемент обеспечивает доступ к элементам верхнего уровня модели через QStandardItem API, что позволяет писать функции, которые могут обрабатывать элементы верхнего уровня и их дочерние элементы единообразно; например, рекурсивные функции, использующие древовидную модель.

Примечание. Вызов index() для объекта QStandardItem, полученного из этой функции, недопустим.

person MBach    schedule 18.09.2015

Я нашел действительно простой способ решить эту проблему - все, что вам нужно сделать, это добавить emit layoutChanged(); к вашей функции insertRows().

Первоначально я испускал dataChanged(), но, по-видимому, это влияет только на данные элемента, данные, связанные с веткой, не являются частью элемента.

Это не так эффективно, как делать это правильно с beginInsertRows() и endInsertRows(), но если количество ваших элементов невелико, этого решения должно быть более чем достаточно.

person Eustace    schedule 08.01.2017
comment
Это не будет работать, если вы используете свою модель с любыми прокси-моделями, которые должны реагировать на любые данные, добавляемые/удаляемые в/из модели. - person Daniel Kamil Kozar; 08.01.2017