Название: Как добавить QCheckBox в QTableView - готовое решение (Qt 5.8) Отправлено: Rododendron от Июль 04, 2017, 11:30 Всю жизнь пользовался только QTableWidget и горя не знал, но тут попалась мне программа с QTableView, завязанной на модель QSqlTableModel.
Оказалось, добавить человеческие чекбоксы через делегаты, не так то просто. Предлагаю свое решение проблемы, т.к. нигде ничего не нашел толкового. 1. Добавление чекбоксов в третью колонку таблицы ui->table в конструкторе Код: for( int i=0; i<model.rowCount(); i++ ) Здесь мы создаем виджет и лайаут для выравнивания чекбокса по центру, добавляем родительский виджет в таблицу и связываем сигнал чекбокса со слотом. model - QSqlModelTable 2. Код обработчика сигнала чекбокса: Код: void ClassName::onCheckBoxChecked(bool isChecked) Здесь ничего хитрого, используем QObject::sender() для получения ссылки на объект, который испустил сигнал. 3. Теперь нужен код для добавления и удаления строк из таблицы. Приведу кусок кода для удаления строки. Сначла удаляем все чекбоксы после удаления выделенной строки: Код: if( !model.removeRows( selectedRow,1 ) ) Далее нам надо занести в базу изменения в модели и обновить ее, чтобы изменения отобразились на QTableView: Код: model.submitAll(); Дальше остается заново добавить все чекбоксы, как в конструкторе. Добавление строк в таблицу осуществляется по тому же принципу. При добавлении и удалении строк в таблице приходится каждый раз удалять все чекбоксы и добавлять заново, потому что при вызове QSqlTableModel::select() обновляется вся таблица. Не думаю, что стоит переживать по этому поводу, работа с базой все равно стоит дороже наших чекбоксов. В принципе все. Остается убрать надписи true/false из ячеек с чекбоксами. Я не стал долго ломать голову, и вам не советую. Можно написать вот такой простенький делегат, который будет менять цвет текста и фона ячеек колонки на базовый: Код: class CheckBoxDelegate : public QItemDelegate Не забываем добавить делегат в конструкторе: Код: ui->table->setItemDelegateForColumn( 3, new CheckBoxDelegate ); Готово. Имеем чекбоксы по центру ячейки, которые нажимаются одним кликом и всегда видны, при этом никакого текста в ячейке нет. Название: Re: Как добавить QCheckBox в QTableView - готовое решение (Qt 5.8) Отправлено: Rododendron от Июль 04, 2017, 12:26 Забыл добавить. Удаление всех чекбоксов при изменении количества строк в таблице не обязательно.
Удаление всего содержимого таблицы происходит при: Код: model.select(); Название: Re: Как добавить QCheckBox в QTableView - готовое решение (Qt 5.8) Отправлено: __Heaven__ от Июль 04, 2017, 13:43 А это не через Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const (http://doc.qt.io/qt-5/qsqltablemodel.html#flags) случаем делается?
Название: Re: Как добавить QCheckBox в QTableView - готовое решение (Qt 5.8) Отправлено: Авварон от Июль 04, 2017, 14:48 А это не через Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const (http://doc.qt.io/qt-5/qsqltablemodel.html#flags) случаем делается? Нет, те прижимаются к краю ячейки |