KL
Konstantin Lazarev7 января 2017 г. 1:40

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

Qt, QStandardItem, QStandardItemModel, QTableView

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

13
Evgenii Legotckoi
  • 7 января 2017 г. 11: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;
}

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

    KL
    • 8 января 2017 г. 22:07

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

      Evgenii Legotckoi
      • 8 января 2017 г. 22:32

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

        KL
        • 9 января 2017 г. 1:54

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

          Evgenii Legotckoi
          • 9 января 2017 г. 10:59

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

            KL
            • 21 января 2017 г. 22:37

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

              Evgenii Legotckoi
              • 22 января 2017 г. 0:45

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

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

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

                  Evgenii Legotckoi
                  • 22 января 2017 г. 20:52

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

                    KL
                    • 22 января 2017 г. 21: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);
                    
                    
                    }
                    
                      KL
                      • 22 января 2017 г. 21:10

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

                        Evgenii Legotckoi
                        • 22 января 2017 г. 21:30

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

                          Evgenii Legotckoi
                          • 22 января 2017 г. 21:56

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

                            Комментарии

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

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

                            • Результат:84баллов,
                            • Очки рейтинга4
                            Ua

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

                            • Результат:42баллов,
                            • Очки рейтинга-8
                            ОК

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

                            • Результат:47баллов,
                            • Очки рейтинга-6
                            Последние комментарии
                            ИМ
                            Игорь Максимов22 ноября 2024 г. 21:51
                            Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                            Evgenii Legotckoi
                            Evgenii Legotckoi31 октября 2024 г. 23:37
                            Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                            A
                            ALO1ZE19 октября 2024 г. 17:19
                            Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                            ИМ
                            Игорь Максимов5 октября 2024 г. 16:51
                            Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                            d
                            dblas55 июля 2024 г. 20:02
                            QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                            Сейчас обсуждают на форуме
                            f
                            firstlunoxod15 февраля 2025 г. 13:46
                            Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                            Дмитрий
                            Дмитрий3 февраля 2025 г. 16:24
                            Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                            NW
                            Nayo Wai30 января 2025 г. 19:22
                            не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                            n
                            nkly3 января 2025 г. 12:52
                            Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                            M
                            Marsel17 августа 2023 г. 0:26
                            OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                            Следите за нами в социальных сетях