Реклама
  • 6 января 2017 г. 19:40

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

Qt, QStandardItem, QStandardItemModel, QTableView

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

  • #
  • Ответ был помечен как решение
  • 7 января 2017 г. 5:58

В 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;
}

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

  • #
  • 8 января 2017 г. 16:07

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

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

  • #
  • 8 января 2017 г. 19:54

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

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

  • #
  • 21 января 2017 г. 16:37

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

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

ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
  • #
  • 22 января 2017 г. 14:43

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

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

  • #
  • 22 января 2017 г. 15:07
void MainWindow::on_comboBox_activated(int index)                              // Выдает информацию о странице. Количество запросов, позицию сайта в Яндекс                                                                 //Позицию сайта в Google и дату последнего обновления
{
    QList<int>Google_Position, Number_Query;
    ui->label_2->setText(DataBase.Query_Page(ui->comboBox->currentText()));
    ui->label_5->setNum(DataBase.Number_Query(ui->comboBox->currentText()));
    ui->label_7->setNum(DataBase.Yandex_Position(ui->comboBox->currentText()));
    ui->label_9->setNum(DataBase.Google_Position(ui->comboBox->currentText()));
    ui->label_11->setText(DataBase.Date_Update(ui->comboBox->currentText()));
model->clear();
List.clear();
List=DataBase.Support_Query(ui->comboBox->currentText());
Google_Position=DataBase.Support_Position(ui->comboBox->currentText());
Number_Query=DataBase.Number_Support_Query(ui->comboBox->currentText());
model->clear();
 model->setHorizontalHeaderLabels(QStringList() << "Запросы в Google" << "Позиция" << "Количество запросов");
   for (int i = 0; i <List.size() ; i++)
        {
       QList<QStandardItem *> items;
               items.append(new QStandardItem(List[i]));  // Первая колонка
               items.append(new QStandardItem(QString::number(Google_Position[i])));                  // Вторая колонка
               items.append(new QStandardItem(QString::number(Number_Query[i])));                  // Третья колонка
               model->appendRow(items);
        }
    ui->tableView->setModel(model);


}
  • #
  • 22 января 2017 г. 15:10

При изменении значения в QComboBox выполняется метод класса. Модель очищается и наполняется новыми данными.

Нет. В данном случае удалять QStandardItem вручную не нужно. Они будут удалены из памяти при вызове метода clear .

Гляньте подробнее вот здесь .

Реклама

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
  • falcon
  • 16 января 2018 г. 17:25

Qt - Тест 001. Сигналы и слоты

  • Результат 100 баллов
  • Очки рейтинга 10
  • falcon
  • 16 января 2018 г. 17:22

Qt - Тест 001. Сигналы и слоты

  • Результат 68 баллов
  • Очки рейтинга -1
  • falcon
  • 16 января 2018 г. 17:18

C++ - Тест 001. Первая программа и типы данных

  • Результат 73 баллов
  • Очки рейтинга 1
Последние комментарии

QML - Урок 021. Переключение между окнами в QML

Спасибо всем. Все получилось. Прикручиваю логику.

  • BlinCT
  • 14 января 2018 г. 19:28

Разработка на Qt под iOS

Вот честно, на сколько же муторно под огрызок что то делать. Куча проблем) А вод линь или под Андроид все просто и тривиально))

  • folax
  • 12 января 2018 г. 9:16

QML - Урок 021. Переключение между окнами в QML

Ничего сложного, делаете по тех заданию 3 файла qml, называете их как указанно в тех задании, потом из первого окна через Loader их переключаете, в окне 2 и 3 делаете сигналы которые при закры...

QML - Урок 021. Переключение между окнами в QML

Все верно, я и не говорил что этот кусок кода лично мое произведение. Это тоже верно: Это задание для прохождения на собеседование в одну из крупных украинских IT компаний. Логику ...

  • folax
  • 12 января 2018 г. 8:13

QML - Урок 021. Переключение между окнами в QML

int main(int argc, char *argv[]){ QApplication app(argc, argv); Logic logic; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("logic", &logic)...

Сейчас обсуждают на форуме

Как проверить доступность сервера

Точно!!! Я сейчас так пробую QNetworkReply *replay_news = networkManager_news->get(QNetworkRequest(QUrl(url_news)));connect(networkManager_news, &QNetworkAccessManager::...

ChartView. Отображение метки данных точки серии при наведении курсора

Спасибо большущее за советы! Все получилось через ScatterSeries. Методы remove() как-то сходу не дались, удаляет в первый раз, а потом программа падает... Не стал тратить время и воспользовалс...

QGraphicsScene

спасибо, за подробное объяснение строчки, а с зумом я разобрался, все работает

  • EVILEG
  • 15 января 2018 г. 17:21

Qt webgl

Насчёт проверки подключения клиента я не в курсе. Что касается экземпляров приложения, то из того, что я читал получается, что нет необходимости в нескольких экземплярах для нескольких кл...

  • EVILEG
  • 15 января 2018 г. 11:39

Проблема добавления #DEFINE при сборке CMak'ом

А Вы не пробовали сделать предкомпилированные библиотеки boost под свою систему, а потом уже подключать собранные библиотеки Boost`а? Просто один только boost может собираться на пару гиг...