2016-12-14 347 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

  • 將那些存儲在QVector<DataRow>中,例如您可以按Date1排序。

  • 遍歷此QVector<DataRow>並查找與條件相對應的元素。
  • 將這些DataRow添加到從QAbstractItemModel派生的類。
  • 顯示此模型來自QAbstractItemModelQTableView

QTableWidget重量級,並沒有真正建立速度。儘管用很少的元素快速構建一些東西非常方便。 QTableView是你想要的一個,自定義模型從QAbstractItemModel繼承。

然後,當用戶請求新輸入時,您可以擦除模型並重新啓動該過程。這不是最佳的,但用戶不應該看到差異。隨意在這裏添加更多的邏輯來保持好的元素,只刪除壞的元素。

關於GUI凍結,一種總是避免的方法是讓GUI線程與其他工作線程分離。 QThread文檔是詳盡的,可以幫助你設置這樣的東西。