2013-08-23 4 views
0

Моя основная цель здесь - переопределить operator<, чтобы я мог сортировать столбцы численно, а не в алфавитном порядке. Код, который я до сих пор:Переопределение QTreeWidgetItem :: operator <

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 
//bunch of includes... 
#include <QTreeWidgetItem> 
#include <QTreeWidget> 

extern QSqlDatabase db; 
extern QString prefix; 
extern QString site; 
extern QString dbname; 
extern QString user; 

namespace Ui { 
class mainwindow; 
} 

class clientinfo; 

class mainwindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit mainwindow(QWidget *parent = 0); 
    void rPopulate(); 
    void rbookingdisplay(); 
    QPushButton *button; 
    ~mainwindow(); 

public slots: 
    //slots... 

private: 
    Ui::mainwindow *ui; 
    void closeEvent(QCloseEvent *close); 
}; 

class TreeWidgetItem : public QTreeWidgetItem 
{ 
public: 
    TreeWidgetItem(QTreeWidget *tree) : QTreeWidgetItem(tree) {} 
    TreeWidgetItem(QTreeWidget * parent, const QStringList & strings) 
        : QTreeWidgetItem (parent,strings) {} 
    bool operator< (const QTreeWidgetItem &other) const 
    { 
     int sortCol = treeWidget()->sortColumn(); 
     int myNumber = text(sortCol).toInt(); 
     int otherNumber = other.text(sortCol).toInt(); 
     return myNumber < otherNumber; 
    } 
}; 

#endif // MAINWINDOW_H 

и mainwindow.cpp У меня есть ui->_display->setSortingEnabled(true);

почему-то не использует переопределены operator< (переопределенный функция никогда не вызывается, он использует предопределенный). Пожалуйста помоги.

ui->_abooking->clear(); 
ui->_abooking->setSortingEnabled(false); 
QSqlQuery query; 
query.prepare(" SELECT shownumdays, shownumpastdays FROM setting_"+ user + 
       " WHERE id = 1; "); 
query.exec(); 
query.first(); 
int days = query.record().value("shownumdays").toInt(); 
int pastdays = query.record().value("shownumpastdays").toInt(); 
query.prepare(" SELECT `"+Columns.join("`, `")+ 
       "`,`Currency`, `# of Room` " 
       " FROM abooking " 
       " WHERE (DATE_ADD(`Arrival Date`,INTERVAL `Nights` - 1 DAY) >= (CURRENT_DATE - "+ QString::number(pastdays) +") AND " 
       " (TO_DAYS(`Arrival Date`) + `Nights` - 1 - TO_DAYS(NOW())) <= "+ QString::number(days) +") "); 
query.exec(); 
QString confirm_num = ""; 
bool flip = true; 
while (query.next()){   
    if (!(confirm_num == query.record().value("Confirmation #").toString())) { 
     flip = (!flip); 
    } 
    QTreeWidgetItem *item = new QTreeWidgetItem(); 
    for (int i = 0; i < Columns.length(); i++) { 
     if (Columns.at(i) == "Arrival Date") { 
      item->setText(i, query.record().value(Columns.at(i)).toDate().toString("dd-MM-yyyy")); 
     } else if ((Columns.at(i) == "Amount Due" || Columns.at(i) == "Paid") && (confirm_num == query.record().value("Confirmation #").toString())) { 
      item->setText(i, ""); 
     } else if ((Columns.at(i) == "Arrival Time")){ 
      item->setText(i, "  " + query.record().value(Columns.at(i)).toTime().toString("hh:mm")); 
     } else { 
      item->setText(i, query.record().value(Columns.at(i)).toString()); 
     } 
     if (Columns.at(i) == "Amount Due" && (!(item->text(i) == ""))) { 
      item->setTextColor(i, Qt::darkRed); 
      item->setText(i, item->text(i) + " " + query.record().value("Currency").toString()); 
     } else if (Columns.at(i) == "Room") { 
      item->setText(i, query.record().value("# of Room").toString() + " " + item->text(i)); 
     } 
     if (flip) { 
      item->setBackground(i , Qt::gray); 
     } 
    } 
    if ((!(confirm_num == query.record().value("Confirmation #").toString()))) { 
     confirm_num = query.record().value("Confirmation #").toString(); 
     ui->_abooking->addTopLevelItem(item); 
    } else { 
     ui->_abooking->topLevelItem(ui->_abooking->topLevelItemCount() - 1)->addChild(item); 
     ui->_abooking->topLevelItem(ui->_abooking->topLevelItemCount() - 1)->setExpanded(true); 
    } 
} 
ui->_abooking->setSortingEnabled(true); 
+0

Где вы создаете экземпляр TreeWidgetItem? – Appleshell

+0

@AdamS Я не совсем понимаю, что вы имеете в виду =/ – throwaway2013

+1

Как вы добавляете содержимое в свой 'QTreeWidget'? –

ответ

1

Вы Переопределение QTreeWidgetItem с пользовательским классом, но тогда вы не использовать его при наполнении QTreeWidget ,

Вместо

QTreeWidgetItem *item = new QTreeWidgetItem(); 

это должно быть:

TreeWidgetItem *item = new TreeWidgetItem(); 

Кроме этого, ваш код operator < выглядит отлично. Я использую то же самое, и это работает для меня.

0
bool operator< (const QTreeWidgetItem &other) const 
{ 
    int sortCol = treeWidget()->sortColumn(); 
    int myNumber = text(sortCol).toInt(); 
    int otherNumber = other.text(sortCol).toInt(); 
    return myNumber < otherNumber; 
} 

Со ссылкой на ваш код здесь выше:

Я думаю, ваша проблема в том, что столбец сортировки виджета остается постоянной для всех QTreeWidgetItems. Вы должны сортировать по значению элемента (не колонка виджета):

Поэтому код должен выглядеть следующим образом:

bool operator< (const QTreeWidgetItem &other) const 
{ 
    Q_ASSERT(other.treeWidget() == treeWidget()); 
    const int col = treeWidget()->sortColumn(); 
    const int role = Qt::DisplayRole; 
    return(data(col, role).toInt() < other.data(col, role).toInt()); 
} 
0

Клетки сортируются в соответствии с типом данных, которые хранятся в них. Вам не нужно переопределять оператора для этого, потому что QVariant позаботится о сравнении для вас.

Например, вы должны использовать:

item−>setData(0, `Qt::EditRole`, 10); 

вместо:

item->setText(0, "10"); 
Смежные вопросы