Qt kontrolka QTableWidget

Stronę tą wyświetlono już: 66 razy

Kontrolka QTableWidget umożliwia wyświetlanie zestawień tabelarycznych danych z możliwością ich ręcznego modyfikowania przez użytkownika, którą można wyłączyć. Przykład zastosowania takiej kontrolki pokazany został na poniższym rysunku.

Qt Creator - przykład wykorzystania kontrolki QTableWidget
Rys. 1
Qt Creator - przykład wykorzystania kontrolki QTableWidget

Kod w pliku nagłówkowym mainwindow.h:

Listing 1
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. namespace Ui {
  5. class MainWindow;
  6. }
  7. class MainWindow : public QMainWindow
  8. {
  9. Q_OBJECT
  10. void resizeEvent(QResizeEvent *event) override;
  11. public:
  12. explicit MainWindow(QWidget *parent = 0);
  13. ~MainWindow();
  14. private:
  15. Ui::MainWindow *ui;
  16. };
  17. #endif // MAINWINDOW_H

Kod w pliku mainwindow.cpp:

Listing 2
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "country.h" // plik z klasą zawierającą dane do tabelki
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. ui->tableWidget->setColumnCount(2); // ustawiam liczbę kolumn
  10. QStringList headerList; // tworzę listę nagłówków kolumny
  11. headerList << "Kraj" << "Stolica"; // dodaję nagłówki
  12. ui->tableWidget->setHorizontalHeaderLabels(headerList); // ustawiam nazwy kolumn w nagłówku
  13. ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); // ustawiam tryb bez możliwości edytowania pól tabeli
  14. // lista obiektów klasy Country zawierających niezbędne dane do wypełnienia tabeli
  15. QList<Country> countries = {
  16. Country("Polska", "Warszawa"),
  17. Country("Czechy", "Praga"),
  18. Country("Słowacja", "Bratysława"),
  19. Country("Litwa", "Wilno"),
  20. Country("Łotwa", "Ryga")
  21. };
  22. QBrush brushBackground(Qt::blue); // tworzę brush wypełnienia tła komórek
  23. foreach(Country country, countries){
  24. country.setTableWidget(ui->tableWidget, brushBackground, Qt::white); // metoda obiektu klasy Country, która ustawia rekord w kontrolce
  25. }
  26. ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // ustawiam zaznaczanie całych wierszy
  27. ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); // ustawiam możliwość zaznaczania pojedynczego rekordu
  28. }
  29. MainWindow::~MainWindow()
  30. {
  31. delete ui;
  32. }
  33. void MainWindow::resizeEvent(QResizeEvent *event){
  34. QWidget::resizeEvent(event);
  35. QRect size = ui->centralWidget->geometry();
  36. ui->tableWidget->setGeometry(0, 0, size.width(), size.height()); // dostosowuję rozmiar kontrolki do okna gdy jego rozmiar się zmienia
  37. }

W pliku nagłówkowym country.h klasy Country kod wygląda następująco:

Listing 3
  1. #ifndef COUNTRY_H
  2. #define COUNTRY_H
  3. #include <QString>
  4. #include <QTableWidget>
  5. class Country
  6. {
  7. QString country;
  8. QString capital;
  9. public:
  10. Country(QString country, QString capital);
  11. // metoda dodająca nowy rekord do kontrolki QTableWidget
  12. void setTableWidget(QTableWidget *countriesTable, const QBrush &backgroundColor, const QColor &color);
  13. };
  14. #endif // COUNTRY_H

W pliku country.cpp:

Listing 4
  1. #include "country.h"
  2. Country::Country(QString country, QString capital) : country(country), capital(capital)
  3. {
  4. }
  5. void Country::setTableWidget(QTableWidget *countriesTable, const QBrush &backgroundColor, const QColor &color){
  6. int index = countriesTable->rowCount(); // pobieram liczbę rekordów (wierszy) w tabeli
  7. countriesTable->setRowCount(index + 1); // zwiększam ją o 1
  8. QTableWidgetItem *itemCountry = new QTableWidgetItem(country); // tworzę element dla pierszej kolumny
  9. itemCountry->setBackground(backgroundColor); // ustawiam mu wypełnienie
  10. itemCountry->setTextColor(color); // ustawiam kolor tekstu
  11. countriesTable->setItem(index, 0, itemCountry); // dodaję do tabeli
  12. QTableWidgetItem *itemCapital = new QTableWidgetItem(capital); // tworzę element dla drugiej kolumny
  13. countriesTable->setItem(index, 1, itemCapital); // dodaję go do drugiej kolumny
  14. }
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-5/qtablewidget.html - opis klasy QTableWidget dostępny na stronie Qt

Komentarze