Михаиллл17 июня 2020 г. 14:05

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

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

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

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

Я так попытался сделать, но почемуту отражает пустые ячейки. Скажите пожалуйста, где у меня могут не получаться данные? Таблица строиться в нужном размере, но с пустыми ячейками.
.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");
}



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

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");
}



ИП

Можно попробовать заменить запрос
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

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

Комментарии

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

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
R

C++ - Тест 002. Константы

  • Результат:75баллов,
  • Очки рейтинга2
R

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

  • Результат:73баллов,
  • Очки рейтинга1
MS

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
Последние комментарии
V

Django - Урок 027. Добавление Google reCAPTCHA

Спасибо. Только использую декоратор не в urls.py а перед views
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять про…

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Стоило перед использованием что ли инструкцию прочитать https://www.cyberforum.ru/blogs/131347/blog2457.html "После сборки при запуске требовались dll," Ясное дело стоило задепло…
R
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, втор…
Сейчас обсуждают на форуме
A

Как в Qt в qmenu добавить scrollarea

Добрый день. Мое имя Кристина. Познакомлюсь с другом для встречи. Приеду к тебе в гости или встримся у меня. Живу близко. Мой адрес

Qt C++ и Python

Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом. Если у вас есть скрипты Py…

Qt + OpenGL glDeleteVertexArrays

Я не уверен, поскольку с OpenGL очень мало работал. Но может быть OpenGL контекст виджета нужно переинициализовывать. И ещё виджет стоит удалять через метод deleteLater() а не п…

QWebEngineView не запускается если к ПК подключено несколько мониторов

Ну я имел ввиду посмотреть на другом ПК с другой графикой и парой мониторов. Как моей программе назначить использовать определенный граф. адаптер? Вот тут понятия не имею.

Счечик производительности сети

Хорошо. После работы сегодня гляну ваш код внимательно.
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB