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

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
}
