Реклама

Работа с таблицами

Qt, QStandardItem, QStandardItemModel, QTableView

@Kostya7 января 2017 г. 1:40#

Подскажите пожалуйста, как работать с таблицами. Как сделать заполнение ячеек текстом.

@EVILEG7 января 2017 г. 11:58#ответил @Kostya

В Qt для таблиц используется концепция модель/представление . То есть имеется класс QTableView , который отвечает за отображения данных в таблице (также этот класс отвечает и за взаимодействие пользователя с данными), а сами данные находятся в модели .

Все модели в Qt наследуются от абстрактной модели QAbstractItemModel . Модель устанавливается в объект QTableView и заполняется данными. Самый простой пример заполнения данными таблицы может быть рассмотрен на примере QStandardItemModel и QStandardItem

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>
#include <QStandardItem>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QStandardItemModel *model;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model = new QStandardItemModel(ui->tableView);
    // Устанавливаем заголовки колонок таблицы
    model->setHorizontalHeaderLabels(QStringList() << "Column 1" << "Column 2" << "Column 3");

    // Заполняем модель данными построчно
    for (int i = 0; i < 4; ++i)
    {
        QList<QStandardItem *> items;
        items.append(new QStandardItem(QString("Row %1").arg(i)));  // Первая колонка
        items.append(new QStandardItem("Item 2"));                  // Вторая колонка
        items.append(new QStandardItem("Item 3"));                  // Третья колонка
        model->appendRow(items);
    }

    // Устанавливаем модель в объект QTableView
    ui->tableView->setModel(model);
}

MainWindow::~MainWindow()
{
    delete ui;
}

В прикреплении архив с примером

Реклама

@Kostya8 января 2017 г. 22:07#

Подскажите, идет объявление объекта класса через new. Нужно использовать удаление объекта для освобождения памяти?

@EVILEG8 января 2017 г. 22:32#ответил @Kostya

В случае с моделью ( QStandardItemModel ) не обязательно, если передавать при создании указатель на родительский элемент. То есть в данном случае им выступает ui->tableView . В случае с QStandardItem надо бы удалять потом, но это надо смотреть по обстоятельствам, когда именно их удалять.

@Kostya9 января 2017 г. 1:54#

Спасибо. Проверил, все работает.

Реклама

@EVILEG9 января 2017 г. 10:59#ответил @Kostya

Если вопрос решён, то помечайте ответ, после которого удалось решить задачу.

@Kostya21 января 2017 г. 22:37#

Подскажите как присвоить заголовкам таблицы размер по контенту.

@EVILEG22 января 2017 г. 0:45#ответил @Kostya

Например вот так:

ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);

Реклама

@Kostya22 января 2017 г. 20:43#

В приложении по нажатию кнопки изменяются данные таблицы. Нужно очищать память после каждого нажатия?

@EVILEG22 января 2017 г. 20:52#ответил @Kostya

Всё зависит от того, какое приложение, какая модель данных используется и т.д. и т.п.
На такой вопрос невозможно ответить не зная, как устроено приложение.

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь

Реклама