Как в 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); непонятно как это правильно сделать, а именно как перебрать все элементы таблицы в строке. А может быть вообще все делается проще и не надо тут фантазировать ?
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Наверное, лучше всё-таки вам посмотреть в сторону QSqlTableModel и использовать QTableView вместо QTableWidget.
В том случае можно будет у модели переопределить метод setData и внутри него переустанавливать все остальные чекбоксы.
Единственное, возможно, что нужно будет переопределить метод flags, чтобы сообщить модели, что это всё checkable колонки.