Как стать автором
Обновить

Комментарии 12

Хорошая статья, но… хотелось бы увидеть код showPopup() и hidePopup(), а также скриншот того, что получилось. Не понятно также как будут работать методы
int currentIndex() const
и
void setCurrentIndex(int index)


QCombobox-a, как они будут связаны с QModelIndex представления и модели?

Код функций приведён в листинге treecombobox.cpp
Не понятно также как будут работать методы
int currentIndex() const и void setCurrentIndex(int index)


Они работают, но главная проблема в том, что QComboBox возвращает индекс строки относительно «корня», он не понимает древовидную модель, поэтому над setCurrentIndex, лучше сделать обёртку, которая будет заниматься установкой нужного индекса.
void TreeComboBox::selectIndex(const QModelIndex &index)
{
    setRootModelIndex(index.parent());
    setCurrentIndex(index.row());
    m_view->setCurrentIndex( index );
}


Получение данных из модели делается стандартными средствами модели, примерно так:
 
auto id   = model->data(model->index(combobox->currentIndex(), 0 ,  combobox->view()->currentIndex().parent()),  Qt::DisplayRole).toInt();
Спасибо!

Спасибо, отлично получилось. Вы меня вдохновили, чтобы тоже что-нибудь про Qt написать из своего опыта :)

А сколько таится нюансов в древовидных моделях…
Обычно я использовал QStandardItemModel, но понадобилась очень сложная и развесистая модель — написал свою. Стандартная Qt-шная — довольно медленная, и навязывает свою архитектуру, что может оказаться очень неудобным в определённых моментах, информации по ним тоже кот наплакал, если табличные модели расписаны в документации «от и до», то древовидные почти не раскрыты.
Но там материала думаю на несколько статей хватит

Древовидные достаточно сложно унифицировать. Поэтому про них и мало написано. Тем более, что некоторые варианты использования сложно визуализировать, например, когда есть дети у ненулевого столбца и т.п.
Главное — это понять что Qt-шная модель, это не модель данных в общепринятом значении, а, скорее часть логики представления. Лучше даже сказать — адаптер.

Пришлось собирать модельку из «частей» из документации и из книги Бланше, а также дописывать много своих методов
Поэтому про них и мало написано.

Вот в этой книге довольно подробно и много.
Qt. Профессиональное программирование. Разработка кроссплатформенных приложений на С++
www.ozon.ru/context/detail/id/6364884
Возможность хорошая, но чем она лучше чем просто комбобокс с пробелами (и спецсимволом на свой вкус для стрелочки)? И не надо возиться с новым классом и пересчётами индекса.
Заголовок спойлера
image

Разве что эту стрелочку с текста комбобокса придётся стирать, если мешает.
У вас #endif затерялся в treecombobox.h.
Да, знаю что такое принято писать в ЛС, но пишу специально сюда, дабы люди научились перечитывать свои статьи на поиск и исправление ошибок. Статье всё-таки больше недели отроду…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории