Russian Qt Forum

Qt => Model-View (MV) => Тема начата: artik от Январь 10, 2017, 10:06



Название: Программный выбор строк QComboBox
Отправлено: 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();


Название: Re: Программный выбор строк QComboBox
Отправлено: Swa от Январь 10, 2017, 13:04
http://doc.qt.io/qt-5/qcombobox.html#setRootModelIndex (http://doc.qt.io/qt-5/qcombobox.html#setRootModelIndex)


Название: Re: Программный выбор строк QComboBox
Отправлено: GreatSnake от Январь 10, 2017, 13:19
http://doc.qt.io/qt-5/qcombobox.html#setRootModelIndex (http://doc.qt.io/qt-5/qcombobox.html#setRootModelIndex)
И чем это ТС поможет?

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


Название: Re: Программный выбор строк QComboBox
Отправлено: artik от Январь 10, 2017, 16:31
http://doc.qt.io/qt-5/qcombobox.html#setRootModelIndex (http://doc.qt.io/qt-5/qcombobox.html#setRootModelIndex)
И чем это ТС поможет?

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


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


Название: Re: Программный выбор строк QComboBox
Отправлено: artik от Январь 10, 2017, 17:20
Не получается. Курю битый час метод match(), он требует стартовый индекс для поиска совпадения, но как его получить в QAbstractItemModel? Метод тыка не работает.
Перебором сделай. Передай пустой индекс.
Наверное я чё-та овсем не того. Код вида
Код:
QModelIndexList list = МоёКомбоБокс.model()->match(QModelIndex(), Qt::DisplayRole, "Текст_для_поиска", -1);
вызывает ошибку. Ткните носом, пожалуйста, что делаю не так?


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

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


Название: Re: Программный выбор строк QComboBox
Отправлено: artik от Январь 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"
.


Название: Re: Программный выбор строк QComboBox
Отправлено: artik от Январь 10, 2017, 21:55
А вот ответ ув. Swa навёл на неочевидное решение вопроса. Вроде получается.


Название: Re: Программный выбор строк QComboBox
Отправлено: Old от Январь 10, 2017, 22:11
Как это осуществить?
В вашей модели вы реализовали метод index, вот он и может вернуть правильный индекс элемента для setCurrentIndex. В метод index можно указать индекс родителя для которого выбирается элемент.


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

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


Название: Re: Программный выбор строк QComboBox
Отправлено: Old от Январь 10, 2017, 22:53
А что возвращает currentIndex() combobox'а, если мышкой выбрать какой нибудь вложенный элемент из дерева?


Название: Re: Программный выбор строк QComboBox
Отправлено: artik от Январь 11, 2017, 00:16
А что возвращает currentIndex() combobox'а, если мышкой выбрать какой нибудь вложенный элемент из дерева?
Возвращает порядковый номер элемента верхнего уровня.  СurrentIndex() любой вложенной ветви возвращает 0.
Я нашел решение, можен не самое оптимальное, путем:
1. Установки нужной родительской ветки в корень модели комбо-бокса методом setRootModelIndex().
2. Установки текущего элемента путем setCurrentIndex().
3. Возврата отображения полного дерева в комбо-боксе методом setRootModelIndex(QModelIndex()).
Выглядит костыльно, но работает. Может кто знает решение по-элегантнее, вэлкам.


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

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


Название: Re: Программный выбор строк QComboBox
Отправлено: artik от Январь 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).


Название: Re: Программный выбор строк QComboBox
Отправлено: GreatSnake от Январь 11, 2017, 14:28
Я нашел решение, можен не самое оптимальное, путем:
1. Установки нужной родительской ветки в корень модели комбо-бокса методом setRootModelIndex().
2. Установки текущего элемента путем setCurrentIndex().
3. Возврата отображения полного дерева в комбо-боксе методом setRootModelIndex(QModelIndex()).
Выглядит костыльно, но работает. Может кто знает решение по-элегантнее, вэлкам.
После исследования исходников подтверждаю, что на данный момент это единственное решение.


Название: Re: Программный выбор строк QComboBox
Отправлено: Old от Январь 11, 2017, 14:36
После исследования исходников подтверждаю, что на данный момент это единственное решение.
Тоже смотрел исходники QComboBox... Отрасль заполонили школьники...  ::)
Хотел по быстрому найти костыль, пока не получилось. :)
Элемент меняется, сигнал отправляется, а lineEdit обновить не получается.


Название: Re: Программный выбор строк QComboBox
Отправлено: kambala от Январь 11, 2017, 16:28
баг открыть не забудьте


Название: Re: Программный выбор строк QComboBox
Отправлено: GreatSnake от Январь 11, 2017, 16:59
баг открыть не забудьте
Дык это не баг. Это qt-ишная фича.