2011-10-21 30 views
10

私はQTableWidgetを持っていて、最初の列には1から1000までの数字が入っています。今度はこの最初の列に基づいてテーブルをソートする必要があります。QTableWidgetでデータを並べ替える方法は?

私は 'SortItemsの(int型の列、Qtの:: AscendingOrder)' 関数を使用していますが、それは次のように表示されます。 1、10、100、1000年、101、102、...

しかし、結果は次のようになります: 1、2、3、4 ....、1000.

私はテーブルを作成するためにcsvファイルを使用しています。誰でも私の手伝いをすることができますか?

答えて

9

最も簡単な方法は、おそらくQTableWidgetItemをサブクラス化して、<演算子を実装して、数字を並べ替えて文字列をソートしていないということを知りたいということです。

class MyTableWidgetItem : public QTableWidgetItem { 
    public: 
     bool operator <(const QTableWidgetItem &other) const 
     { 
      return text().toInt() < other.text().toInt(); 
     } 
}; 

次に、テーブルを作成するときに、汎用アイテムの代わりに適切に並べ替える方法を知っているカスタムアイテムのインスタンスを渡すことができます。

+1

完璧な回答!このコードは私のために優れていました。 – zeFree

+0

ありがとう、これは動作します。新しいバージョンのQtでは、シグネチャが 'bool operator <(const QTableWidgetItem&other)const'に大幅に変更されました。 – iliis

+0

' setData(Qt :: DisplayRole、num) 'がうまく動作しない場合は、 。 – Wesley

17

値はモデルにそのまま格納されているため、値は文字列としてソートされます。ソートするとき、あなたはそれが変換自体をやらせる場合

QVariantは、データの元の型を覚えていることができ、かつ、そのタイプから比較演算子が使用されます。

// Get the value from the CSV file as a numeric type 
int valueFromCsvFile = ...; 

// don't do this 
QTableWidgetItem *item = new QTableWidgetItem(QString::number(valueFromCsvFile)); 

// but do this instead 
QTableWidgetItem *item = new QTableWidgetItem; 
item.setData(Qt::EditRole, valueFromCsvFile);  

セルエディタもに適応しますQVariantの種類:doubleとため

  • intためQSpinBox
  • QDateTime
  • ため
  • QDateTimeEdit ...私の状況で働いていた
+0

私は 'item.setData(Qt :: EditRole、valueFromCsvFile)'を使用しましたが、現在は正常に動作しています。 ありがとうございました! – Shyam

+0

@Shyam、これを受け入れられた回答としてください。私は長いintを使用していたので、これに問題がありました。そして、変わったところでは、QVariantはlong intまたはintで動作しますが、long intでは動作しません。 qlonglongに私の長いintをキャスト私のために働いた。 –

2

一つの方法は、テーブルを充填する前に)

1だったが、仕分けオフ:

table.setSortingEnabled(False) 

2)数字の文字列を空白で埋め、列のすべての文字列を同じ長さにする:

(' '+numStr)[-4:] 

3)テーブルを充填した後、ソートをオン:

table.setSortingEnabled(True) 

これは問題と番号順に並べ替え行を修正しました。

2

私は、受け入れられた回答がうまく動作していたのですが、Qt5.1ではそうではありません。 作業するためには、operator<の定義は、qtablewidget.hの仮想定義と一致しなければなりません。

さらに興味深いのは、数字のある商品を並べ替えることですが、通貨記号($またはなど)で始まるか、%で終わります。このクラス数字のみを使用しなければならないこと

myTableWidget->setItem(row, col, new TableNumberItem("$0")); 

注:

class TableNumberItem : public QTableWidgetItem 
{ 
public: 
    TableNumberItem(const QString txt = QString("0")) 
     :QTableWidgetItem(txt) 
    { 
    } 
    bool operator <(const QTableWidgetItem &other) const 
    { 
     QString str1 = text(); 
     QString str2 = other.text(); 

     if (str1[0] == '$' || str1[0] == '€') { 
      str1.remove(0, 1); 
      str2.remove(0, 1); // we assume both items have the same format 
     } 

     if (str1[str1.length() - 1] == '%') { 
      str1.chop(1); 
      str2.chop(1); // this works for "N%" and for "N %" formatted strings 
     } 

     double f1 = str1.toDouble(); 
     double f2 = str2.toDouble(); 

    return str1.toDouble() < str2.toDouble(); 
    } 
}; 

あなたはこのようなものを使用して数値を含むアイテムを追加し、次に:ここ

は、更新されたコードです、文字列を正しくソートしません(受け入れられた答えの場合もそうです)。

関連する問題