Qt - kontrolka QTableView

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3523 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:

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QStandardItemModel> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT QStandardItemModel *tableViewModel; // model sterujący dodawaniem elementów do kontrolki QTableView void resizeEvent(QResizeEvent *event) override; public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H

Kod w pliku mainwindow.cpp:

#include "mainwindow.h" #include "ui_mainwindow.h" #include "country.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // tworzę obiekt modelu tableViewModel = new QStandardItemModel(ui->tableView); // podpinam model pod kontrolkę QTableView ui->tableView->setModel(tableViewModel); tableViewModel->setColumnCount(2); // ustaiam liczbę kolumn // ustawiam nagłówki kolumn tableViewModel->setHorizontalHeaderLabels( {"Kraj", "Stolica"} ); ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); // ustawiam tryb bez możliwości edytowania pól tabeli // lista obiektów klasy Country zawierających niezbędne dane do wypełnienia tabeli QList<Country> countries = { Country("Polska", "Warszawa"), Country("Czechy", "Praga"), Country("Słowacja", "Bratysława"), Country("Litwa", "Wilno"), Country("Łotwa", "Ryga") }; QBrush brushBackground(Qt::blue); // tworzę brush wypełnienia tła komórek foreach(Country country, countries){ country.setTableWidget(tableViewModel, brushBackground, Qt::white); // metoda obiektu klasy Country, która ustawia rekord w kontrolce } ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); // ustawiam zaznaczanie całych wierszy ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); // ustawiam możliwość zaznaczania pojedynczego rekordu } MainWindow::~MainWindow() { delete ui; } void MainWindow::resizeEvent(QResizeEvent *event){ QWidget::resizeEvent(event); QRect size = ui->centralWidget->geometry(); ui->tableView->setGeometry(0, 0, size.width(), size.height()); }

Kod w pliku country.h:

#ifndef COUNTRY_H #define COUNTRY_H #include <QString> #include <QStandardItemModel> class Country { QString country; QString capital; public: Country(QString country, QString capital); void setTableWidget(QStandardItemModel *countriesTableModel, const QBrush &backgroundColor, const QColor &color); }; #endif // COUNTRY_H

Kod w pliku country.cpp:

#include "country.h" Country::Country(QString country, QString capital) : country(country), capital(capital) { } void Country::setTableWidget(QStandardItemModel *countriesTableModel, const QBrush &backgroundColor, const QColor &color){ int index = countriesTableModel->rowCount(); // pobieram liczbę rekordów (wierszy) w modelu tabeli countriesTableModel->setRowCount(index + 1); // zwiększam ją o 1 QStandardItem *itemCountry = new QStandardItem(country); // tworzę element dla pierszej kolumny //itemCountry->setFlags(itemCountry->flags() & ~Qt::ItemIsEditable); itemCountry->setData(QVariant::fromValue(backgroundColor), Qt::BackgroundRole); // ustawiam mu wypełnienie itemCountry->setData(QVariant::fromValue(color), Qt::ForegroundRole); // ustawiam kolor tekstu countriesTableModel->setItem(index, 0, itemCountry); // dodaję do tabeli QStandardItem *itemCapital = new QStandardItem(capital); // tworzę element dla drugiej kolumny countriesTableModel->setItem(index, 1, itemCapital); // dodaję go do drugiej kolumny }
Strony powiązane
strony powiązane
  1. doc.qt.io/qt-4.8/qtableview.html - opis klasy QTableView dostępny na stronie Qt
Propozycje książek