0

ここでの主な目標はoperator<、列をアルファベット順ではなく数値順にソートできるように再定義することです。私がこれまでに持っているコード:

メインウィンドウ.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);
4

3 に答える 3

1

QTreeWidgetItemカスタム クラスを再実装していますが、 QTreeWidget.

それ以外の

QTreeWidgetItem *item = new QTreeWidgetItem();

これは次のようになります。

TreeWidgetItem *item = new TreeWidgetItem();

それ以外は、コードは問題なくoperator <見えます。私は同じものを使用していますが、私にとってはうまくいきます。

于 2013-08-24T00:59:20.283 に答える
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() );
}
于 2013-08-23T17:47:03.883 に答える