Михаиллл
Михаиллл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
              sf

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

              • Результат:90бали,
              • Рейтинг балів8
              МВ

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

              • Результат:68бали,
              • Рейтинг балів-1
              ЛС

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

              • Результат:53бали,
              • Рейтинг балів-4
              Останні коментарі
              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 аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssr08 лютого 2024 р. 18:43
              Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий Кононенко05 лютого 2024 р. 01:50
              Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Тепер обговоріть на форумі
              J
              JacobFib17 жовтня 2024 р. 03:27
              добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
              ИМ
              Игорь Максимов03 жовтня 2024 р. 04:05
              Реализация навигации по разделам Спасибо Евгений!
              JW
              Jhon Wick01 жовтня 2024 р. 15:52
              Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
              КГ
              Кирилл Гусарев27 вересня 2024 р. 09:09
              Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
              F
              Fynjy22 липня 2024 р. 04:15
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

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