Russian Qt Forum
Ноябрь 26, 2024, 11:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableWidget сортировка по дате  (Прочитано 6208 раз)
merke
Гость
« : Сентябрь 23, 2011, 18:50 »

Всем привет!!!

Имеется QTableWidget, в одном из столбцов находятся записи в формате: "02.2011" "MM.yyyy" т.е. дата. Необходимо отсортировать таблицу по данному столбцу. Подскажите, как отсортировать таблицу по дате?

Буду очень рад помощи!
Записан
blood_shadow
Гость
« Ответ #1 : Сентябрь 23, 2011, 21:37 »

Всем привет!!!

Имеется QTableWidget, в одном из столбцов находятся записи в формате: "02.2011" "MM.yyyy" т.е. дата. Необходимо отсортировать таблицу по данному столбцу. Подскажите, как отсортировать таблицу по дате?

Буду очень рад помощи!
если идти более правильным путем и более простым, то не использовать QTableWidget,, а использовать QTableView + QAbstractTableModel
если же надо именно QTableWidget, то у меня есть идея с некоторым извратом:
получить внутреннюю модель с помощью QAbstractItemView::model (), далее поцепить прокси-модель на нее,
и далее установить эту прокси модель в представление QAbstractItemView::setModel ( QAbstractItemModel * model )

В прокси-модели уже делать соритровку
Записан
Yuriy
Гость
« Ответ #2 : Сентябрь 24, 2011, 00:09 »

Для сортировки делал специальный запрос, потому как SQLite3 не умеет сортировать отечественный формат даты:
Код:
model->setQuery("SELECT CustomID,0 AS Ch,CustNum,CustDate,Customer,CustName, "
                "(PServis+PMebel+PLongs+PAccess+PTexnics) AS PCustom,PServis,Discount,"
                "((PServis+PMebel+PLongs+PAccess+PTexnics)*(1-Discount/100)) AS PDiscount,"
                "PredDate,PredSum,Saloon,Operator "
                "FROM Customers "
                "ORDER BY substr(CustDate,7,4), substr(CustDate,4,2), substr(CustDate,1,2);",db);
model->setPrimaryKey("SELECT MAX(CustomID)+1 FROM Customers;",db);

Соответственно: ORDER BY substr(CustDate,7,4), substr(CustDate,4,2), substr(CustDate,1,2);",db); - сортирует отечественную строку по году, затем по месяцу и в итоге по числу.
Записан
merke
Гость
« Ответ #3 : Сентябрь 24, 2011, 12:01 »

А если перегрузить оператор:

Код
C++ (Qt)
bool QTableWidgetItem::operator< ( const QTableWidgetItem & other ) const

Будет результат?
Записан
merke
Гость
« Ответ #4 : Сентябрь 24, 2011, 13:29 »

Решил проблему перегрузкой оператора < у QTableWidgetItem

Может кому пригодится.

mainwindow.h

Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "tablewidgetitem.h"
 
 
namespace Ui {
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private slots:
   void on_pushButton_clicked();
 
private:
   Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H

mainwindow.cpp

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   int countColumn = 1, countRow = 5;
 
 
   ui->tableWidget->setColumnCount( countColumn );
   ui->tableWidget->setRowCount( countRow );
 
   ui->tableWidget->setItem(0,0, new TableWidgetItem("02.2011"));
   ui->tableWidget->setItem(1,0, new TableWidgetItem("10.2009"));
   ui->tableWidget->setItem(2,0, new TableWidgetItem("04.2010"));
   ui->tableWidget->setItem(3,0, new TableWidgetItem("09.2011"));
   ui->tableWidget->setItem(3,0, new TableWidgetItem("09.1990"));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
   ui->tableWidget->setSortingEnabled(true);
   ui->tableWidget->sortItems(0, Qt::DescendingOrder);
}
 


tablewidgetitem.h

Код
C++ (Qt)
#ifndef TABLEWIDGETITEM_H
#define TABLEWIDGETITEM_H
 
#include <QTableWidgetItem>
#include <QDate>
 
class TableWidgetItem : public QTableWidgetItem
{
public:
   explicit TableWidgetItem(const QString &text, int type = Type);
   bool operator< (const QTableWidgetItem&  other) const;
 
};
 
#endif // TABLEWIDGETITEM_H
 


tablewidgetitem.cpp

Код
C++ (Qt)
#include "tablewidgetitem.h"
 
TableWidgetItem::TableWidgetItem(const QString &text, int type) :
   QTableWidgetItem(text,type)
{
}
 
bool TableWidgetItem::operator <(const QTableWidgetItem&  other) const
{
   return(QDate::fromString(other.data( Qt::DisplayRole ).toString(), "MM.yyyy") > QDate::fromString(data(Qt::DisplayRole ).toString(), "MM.yyyy"));
}
 
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.159 секунд. Запросов: 20.