Как в QTableWidget, состоящей из чекбоксов, в строке таблицы можно было выбрать только один checkbox ?
Сделал таблицу состоящую из чекбоксов по уроку
https://evileg.com/ru/post/78/
Кто-нибудь знает, как сделать так, чтобы в QTableWidget состоящей из чекбоксов в строке таблицы можно было выбрать только один checkbox ? Т.н. эксклюзивный чекбокс ?
Был бы весьма признателен за работающий пример.
По-хорошему хотелось бы также редактировать таблицу выбирая один чекбокс из списка чекбоксов в строках таблицы.
Можно ли генерировать автоматическое обновление таблицы без промежуточных действий, т.е. как только выбрал чекбокс автоматически выполняется SQL UPDATE таблицы.
Мой код по аналогии со статьей, но с небольшими доработками, здесь приведу отрывок:
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- this->setWindowTitle("Как сделать эксклюзивный чекбокс автобновление таблицы после его выбора");
- db = new DataBase();
- db->connectToDataBase();
- /* Вставка в базу данных записей */
- db->insertIntoTable(QVariantList() << "Тестовая запись №1"
- << ""
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- );
- db->insertIntoTable(QVariantList() << "Тестовая запись №2"
- << ""
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- );
- db->insertIntoTable(QVariantList() << "Тестовая запись №3"
- << ""
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- << QString::number(false)
- );
- /* Настраиваем внешний вид таблицы
- * с заданием названий колонок, а также
- * Заполняем таблицу записями из базы данных
- * */
- this->createUI(QStringList() << trUtf8("№")
- << trUtf8("Текстовое Поле №1")
- << trUtf8("Текстовое Поле №2")
- << trUtf8("Столбец чекбоксов №1")
- << trUtf8("Столбец чекбоксов №2")
- << trUtf8("Столбец чекбоксов №3")
- << trUtf8("Столбец чекбоксов №4")
- << trUtf8("Столбец чекбоксов №5")
- << trUtf8("Столбец чекбоксов №6")
- << trUtf8("Столбец чекбоксов №7")
- << trUtf8("Столбец чекбоксов №8")
- << trUtf8("Столбец чекбоксов №9"
- << trUtf8("Столбец чекбоксов №10")
- << trUtf8("Столбец чекбоксов №11")
- << trUtf8("Столбец чекбоксов №12")
- );
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- /* Настройка интерфейса - заполнение QTableWidget записями из таблицы
- * */
- void MainWindow::createUI(const QStringList &headers)
- {
- ui->tableWidget->setColumnCount(15); // Указываем число колонок
- ui->tableWidget->setShowGrid(true); // Включаем сетку
- // Разрешаем выделение только одного элемента
- ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
- // Разрешаем выделение построчно
- ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
- // Устанавливаем заголовки колонок
- ui->tableWidget->setHorizontalHeaderLabels(headers);
- // Создаём запрос для для выборки записей из базы данных
- QSqlQuery query("SELECT "
- DBTABLE ".id, "
- DBTABLE "." TEXT1 ", "
- DBTABLE "." TEXT2 ", "
- DBTABLE "." CHECKBOX1 ", "
- DBTABLE "." CHECKBOX2 ", "
- DBTABLE "." CHECKBOX3 ", "
- DBTABLE "." CHECKBOX4 ", "
- DBTABLE "." CHECKBOX5 ", "
- DBTABLE "." CHECKBOX6 ", "
- DBTABLE "." CHECKBOX7 ", "
- DBTABLE "." CHECKBOX8 ", "
- DBTABLE "." CHECKBOX9 ", "
- DBTABLE "." CHECKBOX10 ", "
- DBTABLE "." CHECKBOX11 ", "
- DBTABLE "." CHECKBOX12
- " FROM " DBTABLE);
- /* Выполняем заполнение QTableWidget записями
- * */
- for(int i = 0; query.next(); i++){
- ui->tableWidget->insertRow(i);
- /* Устанавливаем в первую колонку id забирая его из результата SQL-запроса
- * */
- ui->tableWidget->setItem(i,0, new QTableWidgetItem(query.value(0).toString()));
- // Создаём элементы, который будет выполнять роль чекбоксов
- QTableWidgetItem *item1 = new QTableWidgetItem();
- item1->data(Qt::CheckStateRole);
- item1->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item2 = new QTableWidgetItem();
- item2->data(Qt::CheckStateRole);
- item2->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item3 = new QTableWidgetItem();
- item3->data(Qt::CheckStateRole);
- item3->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item4 = new QTableWidgetItem();
- item4->data(Qt::CheckStateRole);
- item4->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item5 = new QTableWidgetItem();
- item5->data(Qt::CheckStateRole);
- item5->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item6 = new QTableWidgetItem();
- item6->data(Qt::CheckStateRole);
- item6->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item7 = new QTableWidgetItem();
- item7->data(Qt::CheckStateRole);
- item7->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item8 = new QTableWidgetItem();
- item8->data(Qt::CheckStateRole);
- item8->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item9 = new QTableWidgetItem();
- item9->data(Qt::CheckStateRole);
- item9->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item10 = new QTableWidgetItem();
- item10->data(Qt::CheckStateRole);
- item10->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item11 = new QTableWidgetItem();
- item11->data(Qt::CheckStateRole);
- item11->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item12 = new QTableWidgetItem();
- item12->data(Qt::CheckStateRole);
- item12->setCheckState(Qt::Unchecked);
- QTableWidgetItem *item24 = new QTableWidgetItem();
- item24->data(Qt::CheckStateRole);
- item24->setCheckState(Qt::Unchecked);
- ui->tableWidget->setItem(i,1, new QTableWidgetItem(query.value(1).toString()));
- ui->tableWidget->setItem(i,2, new QTableWidgetItem(query.value(2).toString()));
- // Устанавливаем чекбоксы в остальные колонки:
- ui->tableWidget->setItem(i,3, item1);
- ui->tableWidget->setItem(i,4, item2);
- ui->tableWidget->setItem(i,5, item3);
- ui->tableWidget->setItem(i,6, item4);
- ui->tableWidget->setItem(i,7, item5);
- ui->tableWidget->setItem(i,8, item6);
- ui->tableWidget->setItem(i,9, item7);
- ui->tableWidget->setItem(i,10, item8);
- ui->tableWidget->setItem(i,11, item9);
- ui->tableWidget->setItem(i,12, item10);
- ui->tableWidget->setItem(i,13, item11);
- ui->tableWidget->setItem(i,14, item12);
- ui->tableWidget->setItem(i,15, item24);
- }
- ui->tableWidget->resizeColumnsToContents();
- }
UPDATED_TODAY)))):
По поводу того, как сделать эксклюзивный чекбокс мысли следующие: Если пользователь задействует любой из находящихся в строке отображаемой
таблицы(QTableView), то перебираются все чекбосы, кроме задействованного эксклюзивного чекбокса и их состояние активности ставится в ->setCheckState(Qt::Unchecked); непонятно как это правильно сделать, а именно как перебрать все элементы таблицы в строке. А может быть вообще все делается проще и не надо тут фантазировать ?
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Наверное, лучше всё-таки вам посмотреть в сторону QSqlTableModel и использовать QTableView вместо QTableWidget.
В том случае можно будет у модели переопределить метод setData и внутри него переустанавливать все остальные чекбоксы.
Единственное, возможно, что нужно будет переопределить метод flags, чтобы сообщить модели, что это всё checkable колонки.