Qt - kontrolka QTableView

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

Kontrolka QTableView umożliwia wyświetlanie zestawień tabelarycznych danych z możliwością ich ręcznego modyfikowania przez użytkownika, którą można wyłączyć. Kontrolka ta w odróżnieniu od QTableWidget wykorzystuje model do dodawania i formatowania elementów tabeli. Przykład zastosowania takiej kontrolki pokazany został na poniższym rysunku.

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

Kod pliku mainwindow.h:

Listing 1
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QStandardItemModel>
  5. namespace Ui {
  6. class MainWindow;
  7. }
  8. class MainWindow : public QMainWindow
  9. {
  10. Q_OBJECT
  11. QStandardItemModel *tableViewModel; // model sterujący dodawaniem elementów do kontrolki QTableView
  12. void resizeEvent(QResizeEvent *event) override;
  13. public:
  14. explicit MainWindow(QWidget *parent = 0);
  15. ~MainWindow();
  16. private:
  17. Ui::MainWindow *ui;
  18. };
  19. #endif // MAINWINDOW_H

Kod w pliku mainwindow.cpp:

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

Kod w pliku country.h:

Listing 3
  1. #ifndef COUNTRY_H
  2. #define COUNTRY_H
  3. #include <QString>
  4. #include <QStandardItemModel>
  5. class Country
  6. {
  7. QString country;
  8. QString capital;
  9. public:
  10. Country(QString country, QString capital);
  11. void setTableWidget(QStandardItemModel *countriesTableModel, const QBrush &backgroundColor, const QColor &color);
  12. };
  13. #endif // COUNTRY_H

Kod 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(QStandardItemModel *countriesTableModel, const QBrush &backgroundColor, const QColor &color){
  6. int index = countriesTableModel->rowCount(); // pobieram liczbę rekordów (wierszy) w modelu tabeli
  7. countriesTableModel->setRowCount(index + 1); // zwiększam ją o 1
  8. QStandardItem *itemCountry = new QStandardItem(country); // tworzę element dla pierszej kolumny
  9. //itemCountry->setFlags(itemCountry->flags() & ~Qt::ItemIsEditable);
  10. itemCountry->setData(QVariant::fromValue(backgroundColor), Qt::BackgroundRole); // ustawiam mu wypełnienie
  11. itemCountry->setData(QVariant::fromValue(color), Qt::ForegroundRole); // ustawiam kolor tekstu
  12. countriesTableModel->setItem(index, 0, itemCountry); // dodaję do tabeli
  13. QStandardItem *itemCapital = new QStandardItem(capital); // tworzę element dla drugiej kolumny
  14. countriesTableModel->setItem(index, 1, itemCapital); // dodaję go do drugiej kolumny
  15. }
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qtableview.html - opis klasy QTableView dostępny na stronie Qt

Komentarze