Russian Qt Forum

Qt => Общие вопросы => Тема начата: SABROG от Июль 23, 2007, 18:59



Название: Как определить родительский элемент "по-нормальному&quo
Отправлено: SABROG от Июль 23, 2007, 18:59
Есть у меня QTreeView, там два столбца, каждый рутовый элемент имеет несколько дочерних элементов.

В программе функционал сделан таким образом: на каком бы элементе  выделение не стояло родительский (корневой) элемент должен определятся. В том числе, если выделение стоит на родительском элементе, то он должен определятся. Сейчас я это делаю так:

Код:

QModelIndex curr = tvTemplate->currentIndex();
if (tvTemplate->selectionModel()->isSelected(curr))
{
   QStandardItem *root = tvtModel->itemFromIndex(curr)->parent();

   if (!root)
   {
    root = tvtModel->itemFromIndex(curr);
   }

   if (root)
   {
   sTRoot tRoot = root->data(Qt::UserRole).value<sTRoot>();
showLoadXmlDialog(tRoot);
   }
}


Есть соответственно разница между выделением и текущим выбором.
При запуске программы текущий выбор стоит на первом элементе, а вот выделения на нем нету. Я ввел проверку, если текущий элемент выделен, то уже идет проверка сначала как будто это ребенок. Ищем paren'ta, если parent не находится, но элемент валидный - значит это родитель.

Такая вот проверка через заднее место. Можно ли как-то проще это сделать ?


Название: Как определить родительский элемент "по-нормальному&quo
Отправлено: Racheengel от Июль 23, 2007, 21:53
смотри наверно в сторону topLevelItems()


Название: Как определить родительский элемент "по-нормальному&quo
Отправлено: SABROG от Июль 24, 2007, 15:26
Я бы посмотрел, да нет такого метода и похожих у QTreeView.


Название: Как определить родительский элемент "по-нормальному&quo
Отправлено: bigirbis от Июль 25, 2007, 09:03
Вот немного более компактная запись:
Код:
sTRoot tRoot = tvtModel->itemFromIndex( curr.parent().isValid() ? curr.parent() : curr )->data(Qt::UserRole).value<sTRoot>();

Единственное, до этого нужно впаять проверку на валидность индекса


Название: Как определить родительский элемент "по-нормальному&quo
Отправлено: SABROG от Июль 25, 2007, 12:20
Спасибо за упрощение, так получилось:

Код:

QModelIndex curr = tvTemplate->currentIndex();
if (curr.isValid() && tvTemplate->selectionModel()->isSelected(curr))
{
sTRoot tRoot = tvtModel->itemFromIndex( curr.parent().isValid() ? curr.parent() : curr )->data(Qt::UserRole).value<sTRoot>();
showLoadXmlDialog(tRoot);
}