Russian Qt Forum
Ноябрь 24, 2024, 17:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как определить родительский элемент "по-нормальному&quo  (Прочитано 3964 раз)
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 не находится, но элемент валидный - значит это родитель.

Такая вот проверка через заднее место. Можно ли как-то проще это сделать ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июль 23, 2007, 21:53 »

смотри наверно в сторону topLevelItems()
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SABROG
Гость
« Ответ #2 : Июль 24, 2007, 15:26 »

Я бы посмотрел, да нет такого метода и похожих у QTreeView.
Записан
bigirbis
Гость
« Ответ #3 : Июль 25, 2007, 09:03 »

Вот немного более компактная запись:
Код:
sTRoot tRoot = tvtModel->itemFromIndex( curr.parent().isValid() ? curr.parent() : curr )->data(Qt::UserRole).value<sTRoot>();

Единственное, до этого нужно впаять проверку на валидность индекса
Записан
SABROG
Гость
« Ответ #4 : Июль 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);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.157 секунд. Запросов: 22.