Поскольку у меня возникла проблема с производительностью при попытке расширить поддеревья, и этот вопрос является первым результатом Google, я поделюсь своим мнением, хотя я использую C ++ и Qt5.
Решение TonyK с вызовомkeyPressEvent работает.Однако это решение показалось мне хакерским, поэтому я проверил источник Qt, и он действительно привязан к ключу Qt :: Key_Asterisk.(Прямо в QTreeView :: keyPressEvent, если вы хотите убедиться в этом сами.)
QTreeView :: keyPressEvent просто вызывает метод развертки (), в глубине, ничего особенного, никаких частных вызовов API.И, конечно же, когда я просто скопировал код из keyPressEvent, чтобы моя функция работала:
QModelIndex current = currentIndex();
QStack<QModelIndex> parents;
parents.push(current);
QAbstractItemModel * mod = model();
while (!parents.isEmpty()) {
QModelIndex parent = parents.pop();
for (int row = 0; row < mod->rowCount(parent); ++row) {
QModelIndex child = mod->index(row, 0, parent);
if (!child.isValid())
break;
parents.push(child);
expand(child);
}
}
expand(current);
Однако я хотел создать функцию setExpandedRecursive(QModelIndex index, bool expanded)
, поэтому я проверил их разницу с моим кодом, и это просточто они вызывают expand()
для корневого узла поддерева последним вместо первого.Так что я сделал это тоже в своей функции, и угадайте, что, теперь проблема была не в расширении, а в разрушении.Итак, вот мое окончательное решение, которое работает для расширения и сворачивающихся поддеревьев:
void TreeViewClass::setExpandedRecursive(QModelIndex index, bool expanded)
{
if (!index.isValid())
return;
const QAbstractItemModel * model = index.model();
if (!expanded)
setExpanded(index, expanded);
for (int row = 0, count = model->rowCount(index); row < count; ++row)
setExpandedRecursive(model->index(row, 0, index), expanded);
if (expanded)
setExpanded(index, expanded);
}