Evgenii Legotckoi
4 сентября 2015 г. 21:54

Qt/C++ - Урок 016. Как установить QCheckBox в центре ячейки QTableWidget

Одна из первых проблем в работе с QTableWidget, которую пытаются решить, начавшие работать с этим виджетом - это установка QCheckBox в середине ячейки. Дело в том, что в стандартном чекбоксе в QTableWidget чекбокс привязан к левому краю ячейки, а правая часть отдаётся для пояснительного текста. Но текста может и не быть, а область всё равно остаётся. Но при этом QTableWidget позволяет устанавливать в свои ячейки виджеты, чем мы и воспользуемся для решения этой проблемы.

Данная статья является расширением предыдущей статьи по работе с QTableWidget , поэтому для просмотра полного кода проекта рекомендую обратиться также и к той статье. В данной статье приводится лишь код, необходимый для решения поставленной задачи.

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для QCheckBox center

Структура проекта остаётся такой же, как и в предыдущей статье .

mainwindow.ui

Форма окна для приложения с QCheckBox В окне главного приложения будут помещены:

  • QTableWidget
  • QLable

mainwindow.cpp

Вместо стандартного чекбокса будет использован виджет с установленным в нём слоем, в котором будет содержаться QCheckBox, который будет расположен в центре виджета. Также будет продемонстрирован способ, как получить состояние чекбокса из этого виджета. В предыдущем уроке создавалась таблица с устройствами, и нечетные устройствами помечались отмеченными чекбоксами.

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. /* Программный код из предыдущего урока по QTableWidget */
  9. }
  10.  
  11. MainWindow::~MainWindow()
  12. {
  13. delete ui;
  14. }
  15.  
  16. /* Метод для настройки интерфейса,
  17. * в данном методе будет выполняться заполнение QTableWidget
  18. * записями из таблицы
  19. * */
  20. void MainWindow::createUI(const QStringList &headers)
  21. {
  22. /* Программный код из предыдущего урока по QTableWidget */
  23.  
  24. // Создаём запрос для для выборки записей из базы данных
  25. QSqlQuery query("SELECT "
  26. DEVICE ".id, "
  27. DEVICE "." DEVICE_CHECK_STATE ", "
  28. DEVICE "." DEVICE_HOSTNAME ", "
  29. DEVICE "." DEVICE_IP ", "
  30. DEVICE "." DEVICE_MAC
  31. " FROM " DEVICE);
  32.  
  33. /* Выполняем заполнение QTableWidget записями с помощью цикла
  34. * */
  35. for(int i = 0; query.next(); i++){
  36. // Вставляем строку
  37. ui->tableWidget->insertRow(i);
  38. /* Устанавливаем в первую колонку id забирая его из результата SQL-запроса
  39. * Эта колонка будет скрыта
  40. * */
  41. ui->tableWidget->setItem(i,0, new QTableWidgetItem(query.value(0).toString()));
  42.  
  43. // Создаём виджет, который будет содержать в себе чекбокс
  44. QWidget *checkBoxWidget = new QWidget();
  45. QCheckBox *checkBox = new QCheckBox(); // объявляем и инициализируем чекбокс
  46. QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget); // создаём слой с привязкой к виджету
  47. layoutCheckBox->addWidget(checkBox); // Устанавливаем чекбокс в слой
  48. layoutCheckBox->setAlignment(Qt::AlignCenter); // Отцентровываем чекбокс
  49. layoutCheckBox->setContentsMargins(0,0,0,0); // Устанавливаем нулевые отступы
  50. /* Проверяем, на статус нечетности, если нечетное устройство, то
  51. * выставляем состояние чекбокса в Checked, иначе в Unchecked
  52. * */
  53.  
  54. if(query.value(1).toInt() == 1){
  55. checkBox->setChecked(true);
  56. } else {
  57. checkBox->setChecked(false);
  58. }
  59. // Устанавливаем чекбокс во вторую колонку
  60. ui->tableWidget->setCellWidget(i,1, checkBoxWidget);
  61. // Далее забираем все данные из результата запроса и устанавливаем в остальные поля
  62. ui->tableWidget->setItem(i,2, new QTableWidgetItem(query.value(2).toString()));
  63. ui->tableWidget->setItem(i,3, new QTableWidgetItem(query.value(3).toString()));
  64. ui->tableWidget->setItem(i,4, new QTableWidgetItem(query.value(4).toString()));
  65. }
  66.  
  67. // Ресайзим колонки по содержимому
  68. ui->tableWidget->resizeColumnsToContents();
  69.  
  70. /* В данном участке кода мы забираем состояния чекбоксов
  71. * и по порядку выводим их в QLabel
  72. * */
  73. QString str = QString("Состояния чекбоксов:"); // Подготавливаем строку для QLabel
  74.  
  75. for(int i = 0; i < 4; i++){
  76. // Забираем виджет из ячейки
  77. QWidget *item = ( ui->tableWidget->cellWidget(i,1));
  78. // Забираем виджет из слоя и кастуем его в QCheckBox
  79. QCheckBox *checkB = qobject_cast <QCheckBox*> (item->layout()->itemAt(0)->widget());
  80. // Проверяем состояние чекбокса
  81. if(checkB->isChecked()){
  82. str += " 1 "; // добавляем к строку " 1 " , если состояние true
  83. } else {
  84. str += " 0 "; // в противном случае " 0 "
  85. }
  86. }
  87. // Устанавливаем текст в QLabel
  88. ui->label->setText(str);
  89. }

Итог

В результате получилось Приложение, которые выглядит следующим образом.

Приложение с QCheckBox в центре ячейки QTableWidget

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь