Eines der ersten Probleme mit QTableWidget , die Neulinge dieses Widgets zu lösen versuchen, besteht darin, die QCheckBox in der Mitte der Zelle zu setzen. Tatsache ist, dass in der Standard-Checkbox in QTableWidget die Checkbox am linken Rand der Zelle verankert ist und die rechte Seite für den erklärenden Text angegeben ist. Es kann jedoch kein Text vorhanden sein, aber der Bereich bleibt bestehen. Aber gleichzeitig können Sie mit QTableWidget Widgets in Ihren Zellen installieren, mit denen wir dieses Problem lösen werden.
Dieser Artikel ist eine Erweiterung des vorherigen Artikels über die Arbeit mit QTableWidget . Um den vollständigen Code des Projekts anzuzeigen, empfehle ich Ihnen, auch auf . zu verweisen dieser Artikel. Dieser Artikel enthält nur den Code, der zum Beheben des vorliegenden Problems erforderlich ist.
Der Programmcode wurde in QtCreator 3.3.1 basierend auf Qt 5.4.1 geschrieben.
Projektstruktur für QCheckBox-Center
Die Struktur des Projekts bleibt dieselbe wie im vorherigen Artikel .
mainwindow.ui
Fensterformular für eine Anwendung mit QCheckBox Folgendes wird im Hauptanwendungsfenster platziert:
- QTableWidget
- QLable
mainwindow.cpp
Anstelle einer Standard-Checkbox wird ein Widget mit einem darin festgelegten Layer verwendet, das eine QCheckBox enthält, die sich in der Mitte des Widgets befindet. Es wird auch gezeigt, wie Sie den Status eines Kontrollkästchens von diesem Widget abrufen. In der vorherigen Lektion wurde eine Tabelle mit Geräten erstellt und ungerade Geräte wurden mit aktivierten Kontrollkästchen markiert.
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { /* Программный код из предыдущего урока по QTableWidget */ } MainWindow::~MainWindow() { delete ui; } /* Метод для настройки интерфейса, * в данном методе будет выполняться заполнение QTableWidget * записями из таблицы * */ void MainWindow::createUI(const QStringList &headers) { /* Программный код из предыдущего урока по QTableWidget */ // Создаём запрос для для выборки записей из базы данных QSqlQuery query("SELECT " DEVICE ".id, " DEVICE "." DEVICE_CHECK_STATE ", " DEVICE "." DEVICE_HOSTNAME ", " DEVICE "." DEVICE_IP ", " DEVICE "." DEVICE_MAC " FROM " DEVICE); /* Выполняем заполнение 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())); // Создаём виджет, который будет содержать в себе чекбокс QWidget *checkBoxWidget = new QWidget(); QCheckBox *checkBox = new QCheckBox(); // объявляем и инициализируем чекбокс QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget); // создаём слой с привязкой к виджету layoutCheckBox->addWidget(checkBox); // Устанавливаем чекбокс в слой layoutCheckBox->setAlignment(Qt::AlignCenter); // Отцентровываем чекбокс layoutCheckBox->setContentsMargins(0,0,0,0); // Устанавливаем нулевые отступы /* Проверяем, на статус нечетности, если нечетное устройство, то * выставляем состояние чекбокса в Checked, иначе в Unchecked * */ if(query.value(1).toInt() == 1){ checkBox->setChecked(true); } else { checkBox->setChecked(false); } // Устанавливаем чекбокс во вторую колонку ui->tableWidget->setCellWidget(i,1, checkBoxWidget); // Далее забираем все данные из результата запроса и устанавливаем в остальные поля ui->tableWidget->setItem(i,2, new QTableWidgetItem(query.value(2).toString())); ui->tableWidget->setItem(i,3, new QTableWidgetItem(query.value(3).toString())); ui->tableWidget->setItem(i,4, new QTableWidgetItem(query.value(4).toString())); } // Ресайзим колонки по содержимому ui->tableWidget->resizeColumnsToContents(); /* В данном участке кода мы забираем состояния чекбоксов * и по порядку выводим их в QLabel * */ QString str = QString("Состояния чекбоксов:"); // Подготавливаем строку для QLabel for(int i = 0; i < 4; i++){ // Забираем виджет из ячейки QWidget *item = ( ui->tableWidget->cellWidget(i,1)); // Забираем виджет из слоя и кастуем его в QCheckBox QCheckBox *checkB = qobject_cast <QCheckBox*> (item->layout()->itemAt(0)->widget()); // Проверяем состояние чекбокса if(checkB->isChecked()){ str += " 1 "; // добавляем к строку " 1 " , если состояние true } else { str += " 0 "; // в противном случае " 0 " } } // Устанавливаем текст в QLabel ui->label->setText(str); }
Ergebnis
Das Ergebnis ist eine Anwendung, die wie folgt aussieht.
Anwendung mit QCheckBox in der Mitte der QTableWidget-Zelle