Михаиллл
Михаиллл17. Juni 2020 14:05

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

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

6
Evgenii Legotckoi
  • 17. Juni 2020 14:19

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

    Михаиллл
    • 17. Juni 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. Juni 2020 14:51

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

      QModelIndex modelIndex = this->index(index.row(), index.column());
      
        Михаиллл
        • 17. Juni 2020 15:04
        • (bearbeitet)
        • Die Antwort wurde als Lösung markiert.

        Так работает

        #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. Juni 2020 01:34
          • (bearbeitet)

          Можно попробовать заменить запрос
          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. Juni 2020 02:09
            • (bearbeitet)

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

              Kommentare

              Nur autorisierte Benutzer können Kommentare posten.
              Bitte Anmelden oder Registrieren
              Letzte Kommentare
              A
              ALO1ZE19. Oktober 2024 08:19
              Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов5. Oktober 2024 07:51
              Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas55. Juli 2024 11:02
              QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssr8. Februar 2024 18:43
              Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Jetzt im Forum diskutieren
              J
              JacobFib17. Oktober 2024 03:27
              добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
              JW
              Jhon Wick1. Oktober 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. September 2024 09:09
              Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
              F
              Fynjy22. Juli 2024 04:15
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

              Folgen Sie uns in sozialen Netzwerken