Михаиллл
18 июня 2020 г. 0:05

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

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

3

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

6
Evgenii Legotckoi
  • 18 июня 2020 г. 0:19

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

    Михаиллл
    • 18 июня 2020 г. 0:45

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

    1. #ifndef MYSQLMODEL_H
    2. #define MYSQLMODEL_H
    3.  
    4. #include <QObject>
    5. #include <QSqlQueryModel>
    6.  
    7. class MySqlModel: public QSqlQueryModel
    8. {
    9. Q_OBJECT
    10. public:
    11. explicit MySqlModel(QObject *parent = nullptr);
    12.  
    13. enum Roles
    14. {
    15. timeRole1= Qt::UserRole+1,
    16. valueRole1,
    17. numberRole1
    18. };
    19.  
    20. QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
    21. QVariantMap get(int idx) const;
    22.  
    23. signals:
    24.  
    25. protected:
    26. QHash<int,QByteArray> roleNames()const;
    27.  
    28. public slots:
    29. void updateModel();
    30. };
    31. #endif // MYSQLMODEL_H
    32.  

    .cpp

    1. #include "mysqlmodel.h"
    2. #include "QDebug"
    3.  
    4. MySqlModel::MySqlModel(QObject *parent) : QSqlQueryModel (parent)
    5. {
    6. this->updateModel();
    7. }
    8.  
    9. QVariant MySqlModel::data(const QModelIndex &index, int role) const
    10. {
    11. qDebug()<<index.column()<<index.row();
    12. int columnId = role - Qt::UserRole - 1;
    13. // Создаём индекс с помощью новоиспечённого ID колонки
    14. QModelIndex modelIndex = this->index(index.row(), columnId);
    15.  
    16. /* И с помощью уже метода data() базового класса
    17. * вытаскиваем данные для таблицы из модели
    18. * */
    19. return QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
    20. }
    21.  
    22. QVariantMap MySqlModel::get(int idx) const
    23. {
    24. QVariantMap map;
    25. foreach(int k, roleNames().keys()) {
    26. map[roleNames().value(k)] = data(index(idx, 0), k);
    27. }
    28. return map;
    29. }
    30.  
    31. QHash<int, QByteArray> MySqlModel::roleNames() const
    32. {
    33. QHash<int, QByteArray> roles;
    34. roles[timeRole1]="Time";
    35. roles[valueRole1]="Value";
    36. roles[numberRole1]="Number";
    37. return roles;
    38. }
    39.  
    40. void MySqlModel::updateModel()
    41. {
    42. this->setQuery("SELECT Time, Value, Number FROM data12");
    43. }
    44.  
    45.  
    46.  
      Михаиллл
      • 18 июня 2020 г. 0:51

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

      1. QModelIndex modelIndex = this->index(index.row(), index.column());
        Михаиллл
        • 18 июня 2020 г. 1:04
        • (ред.)
        • Ответ был помечен как решение.

        Так работает

        1. #include "mysqlmodel.h"
        2. #include "QDebug"
        3.  
        4. MySqlModel::MySqlModel(QObject *parent) : QSqlQueryModel (parent)
        5. {
        6. this->updateModel();
        7. }
        8.  
        9. QVariant MySqlModel::data(const QModelIndex &index, int role) const
        10. {
        11. QModelIndex modelIndex = this->index(index.row(), index.column());
        12. if (role == Qt::DisplayRole)
        13. {
        14. if(modelIndex.column() != 0){
        15. QVariant variant = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
        16. return variant;
        17. }
        18. else {
        19. QVariant time = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
        20. QString dateTime = QDateTime::fromTime_t(time.toLongLong() ).toString("dd-MM-yyyy hh:mm:ss");
        21. QVariant variant(dateTime);
        22. //QVariant variant = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
        23. return variant;
        24. }
        25. }
        26. return QVariant();
        27. }
        28.  
        29. QVariantMap MySqlModel::get(int idx) const
        30. {
        31. QVariantMap map;
        32. foreach(int k, roleNames().keys()) {
        33. map[roleNames().value(k)] = data(index(idx, 0), k);
        34. }
        35. return map;
        36. }
        37.  
        38. QVariant MySqlModel::headerData(int section, Qt::Orientation orientation, int role) const
        39. {
        40. if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
        41. {
        42. switch (section)
        43. {
        44. case 0:
        45. return "Время";
        46. case 1:
        47. return "Значение";
        48. case 2:
        49. return "Группа";
        50. default:
        51. return QVariant();
        52. }
        53. }
        54. return QAbstractTableModel::headerData(section, orientation, role);
        55. }
        56.  
        57. QHash<int, QByteArray> MySqlModel::roleNames() const
        58. {
        59. QHash<int, QByteArray> roles;
        60. roles[timeRole1]="Time";
        61. roles[valueRole1]="Value";
        62. roles[numberRole1]="Number";
        63. return roles;
        64. }
        65.  
        66. void MySqlModel::updateModel()
        67. {
        68. this->setQuery("SELECT Time, Value, Number FROM data12");
        69. }
        70.  
        71.  
        72.  
          ИП
          • 18 июня 2020 г. 11:34
          • (ред.)

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

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

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

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

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              • Последние комментарии
              • Evgenii Legotckoi
                16 апреля 2025 г. 17:08
                Благодарю за отзыв. И вам желаю всяческих успехов!
              • IscanderChe
                12 апреля 2025 г. 17:12
                Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
              • AK
                1 апреля 2025 г. 11:41
                Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
              • Evgenii Legotckoi
                9 марта 2025 г. 21:02
                К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
              • VP
                9 марта 2025 г. 16:14
                Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…