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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Программный выбор строк QComboBox  (Прочитано 15197 раз)
artik
Гость
« : Январь 10, 2017, 10:06 »

Есть своя реализация древовидной модели на основе QAbstractItemModel. На основе этой модели отображаются виджеты QTreeView и QComboBox (т.е. выпадает дерево). Все отображается корректно, но... Встала задача программно выбирать строки в комбо-боксе. Тут столкнулся с такой проблемой, что методами setCurrentIndex() или setCurrentText() можно выбрать только строки, представляющие ветви дерева верхнего уровня, при том, что мышей все ветви нормально выбираются. Мне же необходимо реализовать возможность программного выбора и дочерних ветвей тоже. Будь то по индексу или по тексту, не важно. Как это осуществить?
Код:
QComboBox cbGroups;
TreeModel model;
cbGroups.setModel(&model);
QTreeView view;
cbGroups.setView(&view);
view.setHeaderHidden(true);
view.expandAll();
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #1 : Январь 10, 2017, 13:04 »

http://doc.qt.io/qt-5/qcombobox.html#setRootModelIndex
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Январь 10, 2017, 13:19 »

И чем это ТС поможет?

2 artik:
попробуй выбирать через
Код
C++ (Qt)
QModelIndexList il = QComboBox::model()->match( ... );
QComboBox::view()->setCurrentIndex( il.first() );
Записан

Qt 5.11/4.8.7 (X11/Win)
artik
Гость
« Ответ #3 : Январь 10, 2017, 16:31 »

И чем это ТС поможет?

2 artik:
попробуй выбирать через
Код
C++ (Qt)
QModelIndexList il = QComboBox::model()->match( ... );
QComboBox::view()->setCurrentIndex( il.first() );
Не получается. Курю битый час метод match(), он требует стартовый индекс для поиска совпадения, но как его получить в QAbstractItemModel? Метод тыка не работает.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #4 : Январь 10, 2017, 17:11 »

Не получается. Курю битый час метод match(), он требует стартовый индекс для поиска совпадения, но как его получить в QAbstractItemModel? Метод тыка не работает.
Перебором сделай. Передай пустой индекс.
« Последнее редактирование: Январь 10, 2017, 17:13 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
artik
Гость
« Ответ #5 : Январь 10, 2017, 17:20 »

Не получается. Курю битый час метод match(), он требует стартовый индекс для поиска совпадения, но как его получить в QAbstractItemModel? Метод тыка не работает.
Перебором сделай. Передай пустой индекс.
Наверное я чё-та овсем не того. Код вида
Код:
QModelIndexList list = МоёКомбоБокс.model()->match(QModelIndex(), Qt::DisplayRole, "Текст_для_поиска", -1);
вызывает ошибку. Ткните носом, пожалуйста, что делаю не так?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Январь 10, 2017, 19:10 »

Не получается. Курю битый час метод match(), он требует стартовый индекс для поиска совпадения, но как его получить в QAbstractItemModel? Метод тыка не работает.
  • QComboBox::model()->index( 0, 0 );
  • QComboBox::view()->rootIndex();

На самом деле странные вопросы, коли ты сам реализовал свою модель.
Записан

Qt 5.11/4.8.7 (X11/Win)
artik
Гость
« Ответ #7 : Январь 10, 2017, 21:53 »

Не получается. Курю битый час метод match(), он требует стартовый индекс для поиска совпадения, но как его получить в QAbstractItemModel? Метод тыка не работает.
  • QComboBox::model()->index( 0, 0 );
  • QComboBox::view()->rootIndex();

На самом деле странные вопросы, коли ты сам реализовал свою модель.

Напомню, что у меня древовидная модель и запись Index(0, 0) не катит. А
Код:
QModelIndexList list = МоёКомбоБокс.model()->match(МоёКомбоБокс.view()->rootIndex(), Qt::DisplayRole, "Текст_для_поиска", -1);
выдаёт ошибку
Код:
QList<T>::at: "index out of range"
.
Записан
artik
Гость
« Ответ #8 : Январь 10, 2017, 21:55 »

А вот ответ ув. Swa навёл на неочевидное решение вопроса. Вроде получается.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Январь 10, 2017, 22:11 »

Как это осуществить?
В вашей модели вы реализовали метод index, вот он и может вернуть правильный индекс элемента для setCurrentIndex. В метод index можно указать индекс родителя для которого выбирается элемент.
Записан
artik
Гость
« Ответ #10 : Январь 10, 2017, 22:42 »

Как это осуществить?
В вашей модели вы реализовали метод index, вот он и может вернуть правильный индекс элемента для setCurrentIndex. В метод index можно указать индекс родителя для которого выбирается элемент.

Метод index() модели возвращает QModelIndex, который содержит информацию о row, column и QModelIndex родителя. Метод же setCurrentIndex виджета QComboBox принимает аргумент типа int, который является порядковым номером элемента в списке. Соответственно просто передать результат index() в setCurrentIndex не удастся. Я не прав?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Январь 10, 2017, 22:53 »

А что возвращает currentIndex() combobox'а, если мышкой выбрать какой нибудь вложенный элемент из дерева?
Записан
artik
Гость
« Ответ #12 : Январь 11, 2017, 00:16 »

А что возвращает currentIndex() combobox'а, если мышкой выбрать какой нибудь вложенный элемент из дерева?
Возвращает порядковый номер элемента верхнего уровня.  СurrentIndex() любой вложенной ветви возвращает 0.
Я нашел решение, можен не самое оптимальное, путем:
1. Установки нужной родительской ветки в корень модели комбо-бокса методом setRootModelIndex().
2. Установки текущего элемента путем setCurrentIndex().
3. Возврата отображения полного дерева в комбо-боксе методом setRootModelIndex(QModelIndex()).
Выглядит костыльно, но работает. Может кто знает решение по-элегантнее, вэлкам.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Январь 11, 2017, 11:10 »

Метод index() модели возвращает QModelIndex, который содержит информацию о row, column и QModelIndex родителя. Метод же setCurrentIndex виджета QComboBox принимает аргумент типа int, который является порядковым номером элемента в списке. Соответственно просто передать результат index() в setCurrentIndex не удастся. Я не прав?
Поэтому выше и было предложено использовать не QComboBox::setCurrentIndex( int ), а QAbstractItemView::setCurrentIndex( QModelIndex ).

Выглядит костыльно, но работает. Может кто знает решение по-элегантнее, вэлкам.
Для установки/получения текущей строки используй QComboBox::view().
« Последнее редактирование: Январь 11, 2017, 11:14 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
artik
Гость
« Ответ #14 : Январь 11, 2017, 13:01 »

Метод index() модели возвращает QModelIndex, который содержит информацию о row, column и QModelIndex родителя. Метод же setCurrentIndex виджета QComboBox принимает аргумент типа int, который является порядковым номером элемента в списке. Соответственно просто передать результат index() в setCurrentIndex не удастся. Я не прав?
Поэтому выше и было предложено использовать не QComboBox::setCurrentIndex( int ), а QAbstractItemView::setCurrentIndex( QModelIndex ).

Выглядит костыльно, но работает. Может кто знает решение по-элегантнее, вэлкам.
Для установки/получения текущей строки используй QComboBox::view().

Так Вы уточняйте, метод setCurrentIndex() какого класса имеете в виду. QComboBox::view()->setCurrentIndex() я испробовал в первую очередь. Способ не работает. Как я понимаю, потому, что этим методом мы устанавливаем текущую строку во вьюшке (сиречь дереве), но в самом комбо-боксе (который отражает лишь один элемент из дерева) всё равно будет отображаться корневой элемент дерева. Пока мы не поменяем его методом QComboBox::setCurrentIndex(int).
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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