Название: Вставить в QComboBox QCheckBox Отправлено: PavelVX от Декабрь 14, 2011, 06:15 Хочу сделать QComboBox у которого элементами будут QCheckBox. Данные берутся с PostgreSQL сервака, но сохранять их обратно пока не требуется.
Для получения данных будет стандартный запрос, три колонки: bool(сам чек), capti (название которое с чеком светится), param (служебная инфа - очень нужная колонка, в ней инфа для пересчетов). Порыл инет и наш форум, нашел http://www.prog.org.ru/topic_4240_0.html и это http://da-crystal.net/2008/06/checkbox-in-qcombobox/. Второй случай все просто, но нельзя прикрутить модель со служебной инфой :( а без нее смысла нет огород городить. А в первом случае не получается прикрутить модель. Лыжи у меня походу не той модели :) CheckBoxList.h Код: class QComboCheckBoxModel : public QSqlQueryModel { Код: //////////////////////////////////////////////////////////////////////////////////// // QListView * tstView = new QListView(this); // QComboCheckBox * tstView = new QComboCheckBox(this); QTableView * tstView = new QTableView(this); QComboCheckBoxModel * tstModel = new QComboCheckBoxModel(this); strSQL = "SELECT 0, 'test', 'value' "; tstModel->setQuery(strSQL); tstView->setModel(tstModel); В случае QTableView появляется и чекбокс и выбор true/false (почему - непонятно), в случае QListView - пустой список, а в случае QComboCheckBox сам комбобокс, но список не раскрывается. Где и что я делаю не так??? Название: Re: Вставить в QComboBox QCheckBox Отправлено: PavelVX от Декабрь 15, 2011, 10:27 Не получается у меня QListView заполнить правильно. В итоге переделал пример с ролями.
Неужели никто из более опытных товарищей не делал подобного? Это же очень удобно для сужения областей поиска и подобных вещей. Название: Re: Вставить в QComboBox QCheckBox Отправлено: Авварон от Декабрь 15, 2011, 11:37 в модели переопределяете флаги и делаете дату на чекед стейт роль. всё.
Название: Re: Вставить в QComboBox QCheckBox Отправлено: Странник от Декабрь 15, 2011, 17:19 задача ваша что-то не очень понятна. сколько столбцов должно отображаться, три? что значит "пока" без возможности сохранения - то есть, в перспективе понадобится?
если я все понял правильно, и у вас три столбца, один из которых булева типа и должен отображаться как QCheckBox, я бы сделал свой QCheckBox делегат (неужели нет готовых?). в качестве view для QComboBox установил QTableView. вариант, приведенный выше, тоже имеет право на жизнь. он более прост, пожалуй, но лично мне кажется менее логичным. Название: Re: Вставить в QComboBox QCheckBox Отправлено: PavelVX от Декабрь 16, 2011, 07:08 Отображается два столбца, булев + название, третий, скрытый, нужен для дальнейшей обработки. В нем, например, можно хранить ключи для дальнейшей обработки выбора. Сохранение в базу не нужно.
Своеобразным примером можно привести следующий случай: поиск по географическому положению. уровень 1. комбобокс с чеками содержит региональные деления, что-то выбрав из него, вы уменьшили количество доступных вариантов в комбе 2 уровня. уровень 2. комбо с чеками содержит области, причем только те, что разрешены на первом уровне. уровень 3. комбо с чеками с названиями городов. Только те области, что разрешены на 2 уровне. И тд и тп. Таким образом на выходе получим нужный набор элементов. Если это можно как-то по другому получить, то выслушаю с вниманием. Странник, я недопонял :(. Предлагается следующее: у QComboBox view сделать QTableView, а в нем сделать все делегатами на основе QCheckBox? Авварон, в data if (index.column() == 0) value = value.toBool(); в flags if (index.column() == 0) flags = flags | Qt::ItemIsUserCheckable | Qt::ItemIsEditable; Разве этого недостаточно, что бы первый столбец был редактируемым чеком? Название: Re: Вставить в QComboBox QCheckBox Отправлено: Странник от Декабрь 16, 2011, 10:49 Странник, я недопонял :(. Предлагается следующее: у QComboBox view сделать QTableView, а в нем сделать все делегатами на основе QCheckBox? для булевой колонки установить свой делегат. не придется наследоваться от модели.Авварон, в data if (index.column() == 0) value = value.toBool(); в flags if (index.column() == 0) flags = flags | Qt::ItemIsUserCheckable | Qt::ItemIsEditable; Разве этого недостаточно, что бы первый столбец был редактируемым чеком? чтобы получить желаемое при переопределении модели, вам необходимо: 1. отображать только столбец с названием 2. переопределить flags и для столбца с названием возвращать флаг Qt::ItemIsUserCheckable 3. переопределить data() и в CheckStateRole для столбца с названием возвращать Qt::Checked или Qt::Unckecked в зависимости от значения булева столбца |