Михаиллл
Михаиллл17 червня 2020 р. 14:05

Можно ли в QTableView менять значения в столбце.

Добрый день.
У меня есть база, в табличке один из столбцов - дата в секундах типа "1564820737". Можноли в QTableView менять отображение или значение, другими словами менять "1564820737" на нужный формат даты и времени?

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

Вам це подобається? Поділіться в соціальних мережах!

6
Evgenii Legotckoi
  • 17 червня 2020 р. 14:19

Добрый день. Наследуйтесь от модели данных, которая отвечает за данную таблицу. Потом переопределите метод data, чтобы сконвертировать секунды в нужный формат. И возвращайте для этого столбца сконвертированное значение. QDateTime имеет метод для формата времени и даты.

    Михаиллл
    • 17 червня 2020 р. 14:45

    Я так попытался сделать, но почемуту отражает пустые ячейки. Скажите пожалуйста, где у меня могут не получаться данные? Таблица строиться в нужном размере, но с пустыми ячейками.
    .h

    #ifndef MYSQLMODEL_H
    #define MYSQLMODEL_H
    
    #include <QObject>
    #include <QSqlQueryModel>
    
    class MySqlModel: public QSqlQueryModel
    {
        Q_OBJECT
    public:
        explicit MySqlModel(QObject *parent = nullptr);
    
        enum Roles
        {
            timeRole1= Qt::UserRole+1,
            valueRole1,
            numberRole1
        };
    
        QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
        QVariantMap get(int idx) const;
    
    signals:
    
    protected:
        QHash<int,QByteArray> roleNames()const;
    
    public slots:
        void updateModel();
    };
    #endif // MYSQLMODEL_H
    
    

    .cpp

    #include "mysqlmodel.h"
    #include "QDebug"
    
    MySqlModel::MySqlModel(QObject *parent) : QSqlQueryModel (parent)
    {
        this->updateModel();
    }
    
    QVariant MySqlModel::data(const QModelIndex &index, int role) const
    {
        qDebug()<<index.column()<<index.row();
        int columnId = role - Qt::UserRole - 1;
        // Создаём индекс с помощью новоиспечённого ID колонки
        QModelIndex modelIndex = this->index(index.row(), columnId);
    
        /* И с помощью уже метода data() базового класса
         * вытаскиваем данные для таблицы из модели
         * */
        return QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
    }
    
    QVariantMap MySqlModel::get(int idx) const
    {
        QVariantMap map;
        foreach(int k, roleNames().keys()) {
            map[roleNames().value(k)] = data(index(idx, 0), k);
        }
        return map;
    }
    
    QHash<int, QByteArray> MySqlModel::roleNames() const
    {
        QHash<int, QByteArray> roles;
        roles[timeRole1]="Time";
        roles[valueRole1]="Value";
        roles[numberRole1]="Number";
        return roles;
    }
    
    void MySqlModel::updateModel()
    {
        this->setQuery("SELECT Time, Value, Number FROM data12");
    }
    
    
    
    
      Михаиллл
      • 17 червня 2020 р. 14:51

      Похоже если так сделать, то наверно будет нормально, нужно только вспомнить, как галочки убрать в таблице

      QModelIndex modelIndex = this->index(index.row(), index.column());
      
        Михаиллл
        • 17 червня 2020 р. 15:04
        • (відредаговано)
        • Відповідь була позначена як рішення.

        Так работает

        #include "mysqlmodel.h"
        #include "QDebug"
        
        MySqlModel::MySqlModel(QObject *parent) : QSqlQueryModel (parent)
        {
            this->updateModel();
        }
        
        QVariant MySqlModel::data(const QModelIndex &index, int role) const
        {
            QModelIndex modelIndex = this->index(index.row(), index.column());
            if (role == Qt::DisplayRole)
            {
                if(modelIndex.column() != 0){
                    QVariant variant = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
                    return variant;
                }
                else {
                    QVariant time = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
                    QString dateTime = QDateTime::fromTime_t(time.toLongLong() ).toString("dd-MM-yyyy hh:mm:ss");
                    QVariant variant(dateTime);
                    //QVariant variant = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
                    return variant;
                }
            }
            return QVariant();
        }
        
        QVariantMap MySqlModel::get(int idx) const
        {
            QVariantMap map;
            foreach(int k, roleNames().keys()) {
                map[roleNames().value(k)] = data(index(idx, 0), k);
            }
            return map;
        }
        
        QVariant MySqlModel::headerData(int section, Qt::Orientation orientation, int role) const
        {
            if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
            {
                switch (section)
                {
                case 0:
                    return "Время";
                case 1:
                    return "Значение";
                case 2:
                    return "Группа";
                default:
                    return QVariant();
                }
            }
            return QAbstractTableModel::headerData(section, orientation, role);
        }
        
        QHash<int, QByteArray> MySqlModel::roleNames() const
        {
            QHash<int, QByteArray> roles;
            roles[timeRole1]="Time";
            roles[valueRole1]="Value";
            roles[numberRole1]="Number";
            return roles;
        }
        
        void MySqlModel::updateModel()
        {
            this->setQuery("SELECT Time, Value, Number FROM data12");
        }
        
        
        
        
          ИП
          • 18 червня 2020 р. 01:34
          • (відредаговано)

          Можно попробовать заменить запрос
          SELECT Time, Value, Number FROM data12 на
          SELECT from_unixtime(Time, '%D-%Y-%M %H:%i:%s'), Value, Number FROM data12,

          а чтобы не менять заголовки в модели, можно сделать так:

          SELECT 
              from_unixtime(Time, '%D-%Y-%M %H:%i:%s') AS "Время", 
              Value AS "Значение", 
              Number AS "Группа" 
          FROM data12
          
            Evgenii Legotckoi
            • 18 червня 2020 р. 02:09
            • (відредаговано)

            Это вредный совет. Вы добавляете бессмысленную и беспощадную нагрузку на базу данных.
            В случае наличия 1000 клиентских машин на один сервер вы нагружаете сервер двумя тысячами бесполезных запросов, в то время как клиентская программа справится с подобным "за пару лишних тактов", условно говоря, и не подавится.

              Коментарі

              Only authorized users can post comments.
              Please, Log in or Sign up
              AD

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:50бали,
              • Рейтинг балів-4
              m
              • molni99
              • 26 жовтня 2024 р. 01:37

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:80бали,
              • Рейтинг балів4
              m
              • molni99
              • 26 жовтня 2024 р. 01:29

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:20бали,
              • Рейтинг балів-10
              Останні коментарі
              ИМ
              Игорь Максимов22 листопада 2024 р. 11:51
              Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii Legotckoi31 жовтня 2024 р. 14:37
              Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZE19 жовтня 2024 р. 08:19
              Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов05 жовтня 2024 р. 07:51
              Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas505 липня 2024 р. 11:02
              QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Тепер обговоріть на форумі
              Evgenii Legotckoi
              Evgenii Legotckoi24 червня 2024 р. 15:11
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey115 листопада 2024 р. 06:04
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProject04 червня 2022 р. 03:49
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
              9
              9Anonim25 жовтня 2024 р. 09:10
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

              Слідкуйте за нами в соціальних мережах