2016-12-14 15 views
0

QTableWidgetで行を検索する必要があります。テーブルの各行には日付のあるフィールドがあり、ユーザーの入力に基づいて指定された日付間隔内の行のみを表示する必要があります。ここに私の関数です:QTableWidget行による高速検索

void nvr::sort() 
{ 

QTableWidget* tabela = this->findChild<QTableWidget*>("NCtable"); 



QDateEdit* c1 = this->findChild<QDateEdit*>("c1"); 

QDateEdit* c2 = this->findChild<QDateEdit*>("c2"); 

// user specified ranges for date 
QDate date1 = c1->date(); 

QDate date2 = c2->date(); 

//row numbers in table 
int rowsNum = tabela->rowCount(); 

// hide all rows 
for(int z = 0; z < rowsNum; z++) { 

    tabela->hideRow(z); 

} 

// show only rows that are within range 
for(int z = 0; z < rowsNum; z++) { 


    QDateTime dateTime = QDateTime::fromString(tabela->item(z,2)->text(),"dd.MM.yyyy hh:mm"); 

    QDate date = dateTime.date(); 

    //date compares 
    if ((date1.operator <=(date)) && (date2.operator >=(date))) { 

    tabela->showRow(z); 

    } 



    } 



} 

これは私が200の行を持っていればうまく動作します。しかし、私は30 000の行を持っていると私は確かに、GUIがフリーズするので、私は関数が非常に遅く実行されると仮定します。より速い実行のための任意の提案?

+0

QVectorにデータを格納する場合(たとえばdate1でソート)は、ユーザーが日付を入力したときにループし、有効なものをQStandardItemModelに追加し、QTableViewで表示します。ユーザーがこれらの日付を変更した場合は、QStandardItemModelをクリアしてプロセスを再起動するだけです。これは30 000行で簡単に動作するはずです。 –

答えて

0

あなたの問題を再現するのは難しいですが、ここで私はかかるだろうなアプローチです:

  • のは DataRowそれを呼びましょう、1行のデータを格納するためのカスタムクラスを作成します。

  • QVector<DataRow>に保存します。たとえば、Date1でソートすることができます。

  • このQVector<DataRow>をループし、基準に対応する要素を見つけます。
  • DataRowQAbstractItemModelに由来するクラスに加えます。
  • QAbstractItemModelに由来するこのモデルをQTableViewで表示してください。

QTableWidgetは、実際には速度が向上していません。しかし、いくつかの要素で素早く何かを構築するのは本当に便利です。 QTableViewは希望のモデルで、カスタムモデルはQAbstractItemModelから継承されています。

ユーザーが新しい入力を要求したら、モデルを消去してプロセスを再起動するだけです。これは最適ではありませんが、ユーザーには違いは見られません。良い要素を保ち、悪い要素だけを取り除くためにここに論理を追加してください。

GUIフリーズについては、GUIスレッドを他のワーカースレッドから分離することを常に避ける方法の1つです。 QThreadのマニュアルは網羅的で、このような設定を手助けすることができます。

関連する問題