Юрий
30 декабря 2021 г. 0:45

Сортировка по дате и времени QSortFilterProxyModel QSqlRelationalTableModel

Добрый вечер.

Хочу сортировать в QTableView по заголовку колонки по дате и времени, сейчас сортирует как строку.

Данные беру из БД SQLite, тип записи DATETIME.

  1. void Equipment::initTableGoods()
  2. {
  3. dataBase->connOpen();
  4. modelGoods = new QSqlRelationalTableModel(this);
  5. modelGoods->setTable("goods");
  6. modelGoods->setFilter("goods.active = '1'");
  7.  
  8. modelGoods->setRelation(1, QSqlRelation("ref_type", "id", "name"));
  9. modelGoods->setRelation(2, QSqlRelation("ref_goods", "id", "name"));
  10. modelGoods->setRelation(3, QSqlRelation("ref_mol", "id", "name"));
  11. modelGoods->setRelation(
  12. 8, QSqlRelation("ref_condition", "id_ref_condition", "name_ref_condition"));
  13. modelGoods->setRelation(12,
  14. QSqlRelation("ref_location", "id_ref_location", "name_ref_location"));
  15.  
  16.  
  17. modelGoods->setHeaderData(1, Qt::Horizontal, tr("Тип"));
  18. modelGoods->setHeaderData(2, Qt::Horizontal, tr("Наименование"));
  19. modelGoods->setHeaderData(3, Qt::Horizontal, tr("МОЛ"));
  20. modelGoods->setHeaderData(4, Qt::Horizontal, tr("MAC"));
  21. modelGoods->setHeaderData(5, Qt::Horizontal, tr("IP"));
  22. modelGoods->setHeaderData(6, Qt::Horizontal, tr("S/N"));
  23. modelGoods->setHeaderData(7, Qt::Horizontal, tr("Инвентарный номер"));
  24. modelGoods->setHeaderData(8, Qt::Horizontal, tr("Статус"));
  25. modelGoods->setHeaderData(9, Qt::Horizontal, tr("Имя устройства в сети"));
  26. modelGoods->setHeaderData(10, Qt::Horizontal, tr("Статус"));
  27. modelGoods->setHeaderData(11, Qt::Horizontal, tr("Расположение"));
  28. modelGoods->setHeaderData(12, Qt::Horizontal, tr("Расположение"));
  29. modelGoods->setHeaderData(13, Qt::Horizontal, tr("Доступность"));
  30. modelGoods->setHeaderData(15, Qt::Horizontal, tr("Комментарий"));
  31. modelGoods->setHeaderData(16, Qt::Horizontal, tr("Последние обновления"));
  32.  
  33. modelGoods->select();
  34.  
  35. sort->setSourceModel(modelGoods);
  36. ui->tableView->setModel(sort); // Устанавливаем модель на TableView
  37. ui->tableView->setColumnHidden(0,
  38. true); // Скрываем колонку
  39. ui->tableView->setColumnHidden(10,
  40. true); // Скрываем колонку
  41. ui->tableView->setColumnHidden(11,
  42. true); // Скрываем колонку
  43. ui->tableView->setColumnHidden(14,
  44. true); // Скрываем колонку
  45. // Разрешаем выделение строк
  46. ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  47. // Устанавливаем режим выделения лишь одной строки в таблице
  48. ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
  49. // Устанавливаем размер колонок по содержимому
  50. ui->tableView->resizeColumnsToContents();
  51. ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); // Запрещаем редактирование
  52. ui->tableView->horizontalHeader()->setStretchLastSection(
  53. true); // Растягиваем последнюю колонку по всему tableView
  54.  
  55. dataBase->connClose();
  56. }

2

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

1
Evgenii Legotckoi
  • 30 декабря 2021 г. 20:35
  • Ответ был помечен как решение.

Добрый день.

Наследуйте модель сортировки от QSortFilterProxyModel и переопределите метод QSortFilterProxyModel::lessThan таким образом, чтобы вы забирали через индексы дату и время из модели, создавали бы объекты QDateTime и сравнивали бы их друг с другом, тогда это будет работать. Но конкретно для этой колонки, для всех остальных вызывайте методы базового класса.

    Комментарии

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