Название: QTableWidget сортировка по дате
Отправлено: merke от Сентябрь 23, 2011, 18:50
Всем привет!!!
Имеется QTableWidget, в одном из столбцов находятся записи в формате: "02.2011" "MM.yyyy" т.е. дата. Необходимо отсортировать таблицу по данному столбцу. Подскажите, как отсортировать таблицу по дате?
Буду очень рад помощи!
Название: Re: QTableWidget сортировка по дате
Отправлено: blood_shadow от Сентябрь 23, 2011, 21:37
Всем привет!!!
Имеется QTableWidget, в одном из столбцов находятся записи в формате: "02.2011" "MM.yyyy" т.е. дата. Необходимо отсортировать таблицу по данному столбцу. Подскажите, как отсортировать таблицу по дате?
Буду очень рад помощи!
если идти более правильным путем и более простым, то не использовать QTableWidget,, а использовать QTableView + QAbstractTableModel если же надо именно QTableWidget, то у меня есть идея с некоторым извратом: получить внутреннюю модель с помощью QAbstractItemView::model (), далее поцепить прокси-модель на нее, и далее установить эту прокси модель в представление QAbstractItemView::setModel ( QAbstractItemModel * model ) В прокси-модели уже делать соритровку
Название: Re: QTableWidget сортировка по дате
Отправлено: Yuriy от Сентябрь 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); - сортирует отечественную строку по году, затем по месяцу и в итоге по числу.
Название: Re: QTableWidget сортировка по дате
Отправлено: merke от Сентябрь 24, 2011, 12:01
А если перегрузить оператор: C++ (Qt) bool QTableWidgetItem::operator< ( const QTableWidgetItem & other ) const
Будет результат?
Название: Re: QTableWidget сортировка по дате
Отправлено: merke от Сентябрь 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.cppC++ (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.hC++ (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.cppC++ (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")); }
|