2011-10-31 12 views
6

を再増殖が続くソート後移入しないすべてのセル私はこのようなQTableWidgetを移入しました:奇妙QTableWidget挙動 -

// Clear the table 
    this->topPatchesTableWidget->setRowCount(0); 

    this->topPatchesTableWidget->setRowCount(numberToDisplay); 
    for(unsigned int pairId = 0; pairId < numberToDisplay; ++pairId) 
    { 
    // Display patch match scores 
    QTableWidgetItem* myLabel = new QTableWidgetItem; 
    myLabel->setData(Qt::DisplayRole, myValues[pairId]); 
    this->tableWidget->setItem(pairId, 0, myLabel); 
    ... fill other columns ... 
    } 

(IはmyValuesの値を計算するプロパティを設定するためにいくつかの他のUI要素を有します) 。プロパティを変更して再計算し、テーブルを再作成すると、すべて正常に動作します。ヘッダーの1つをクリックしてテーブルを並べ替えると、正しく並べ替えられます。しかし、この時点(ソート後)に値を再計算してテーブルを再作成するには、もう一度ボタンをクリックすれば、テーブルは非常に壊れています。つまり、多くのセルが空であり、空でないセルは特定の順序ではないように見えます。私のCreateTable関数の先頭で

this->tableWidget->sortByColumn(0, Qt::AscendingOrder); 

に手動コールを追加することにより

、すべてが期待通りに動作しますが、もちろん、新しく作成されたテーブルは、列0ではなく、ために選択した列でソートされます最後の並べ替え

sortByColumnを呼び出さないと誰かが間違っている理由が分かりませんか? (私は簡単な例を作ろうとしましたが、デモプログラムで問題を再現することはできません)。

おかげで、

デビッド

答えて

12

列ヘッダーが選択されていて、その列がポピュレートされなくなった後にセルを並べ替えることができるようにすると、同様の問題が発生しました。

私は、セルaddableメソッドの先頭にself.tableWidget.setSortingEnabled(False)を設定してから、addメソッドの最後にself.tableWidget.setSortingEnabled(True)に設定しています。 riverbank computingによれば、これはこの問題に対処するために正式に推奨される方法です。

QTableWidget.setItem(自己、INT行、INTカラム、QTableWidgetItemアイテム)

ソーティング場合が有効であることに留意されたい(sortingEnabled参照)、カラムは、現在のソート列であります行はアイテムによって決定されたソートされた位置に移動されます。

ループ内でsetItem()を呼び出すなどして、特定の行のいくつかの項目を設定する場合は、ソートをオフにしてから後でオンにしたい場合があります。同じ行のすべての項目に対して同じ行引数を使用できます(つまり、setItem()は行を移動しません)。

item()およびtakeItem()も参照してください。

+0

これはうまくいって、私はこの質問に対する答えに違いないと思います。 PyQt4を使ってQTableWidgetでテストされています。 – ray

0

私はこれで間違っていたものを考え出したことはありません。私はあきらめて、カスタムモデル/ビューを実装しました。これはおそらくもっと良いアイデアです。

+1

Karnisovはこの質問に対してより良い答えを提供しました。私はあなたが戻ってきて解決策として彼を選ぶべきだと思う。 – ray

1

私は同じ問題を抱えていた - 私は新しいデータを挿入したいときは常に、私はヘッダーをbuildetとsetSortingEnabled(true)。私はQTableWidgetがsetSortingEnabled(true)のいくつかの呼び出しを好まないと思います。だから私はそれを私のMainWindownのコンストラクタに入れ、それはそれです!

0

これは、Karnisovの答えについても、PyQtについても詳しく述べられています。

oldSort = t.horizontalHeader().sortIndicatorSection() 
oldOrder = t.horizontalHeader().sortIndicatorOrder() 
t.setSortingEnabled(False) 

# make the changes 

t.sortItems(oldSort, oldOrder) 
t.setSortingEnabled(True) 

注それはまだのために可能であること:tQTableWidgetここで任意のsetItem() Sを行う前に、仕分け無効にすることも、私のために働いたが、それは、ユーザのソート選択が失われる原因となったので、私はこのようにそれをやりましたソートはこのコードで少し変更されます。これはQtは、ここで使用しているソートがために存在していたすべての項目を移動しないためであると思わので、我々はこのようなテーブルを持っていた場合:

NUMBER LETTER OTHER LETTER 
    1   B    C 
    2   G    Q 
    3   A    Q 

我々ソート数で、その後、他の文字でいる場合何も変わりません。我々は以前、LETTERにより、他の文字を並べ替えていたのであれば、このコードは他の唯一のLETTERにより、単一の並べ替えを行うだろう

NUMBER LETTER OTHER LETTER 
    1   B    C 
    3   A    Q 
    2   G    Q 

、私たちは」:しかし、私たちは、ソートLETTERで、その後、他のLETTERによって、我々は取得する場合dは最初のものではなくテーブルの2番目のバージョンで終わります(要素がテーブルに追加された順番がNUMBERであると仮定して)。私のコードのこの場所では、すべてのアイテムが削除され、テーブルをリフレッシュするために再追加されるため、時々目立つような変更が発生することがあります。