簡體   English   中英

快速搜索QTableWidget行

[英]Fast search through QTableWidget rows

我需要通過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行,這工作正常。 但是當我有3萬行並且我肯定會的時候,gui會凍結,因為我認為該函數的執行速度非常慢。 有什么建議可以加快執行速度嗎?

重現您的問題很困難,但是這是我要采取的方法:

  • 創建一個自定義類來存儲一行的數據,我們將其稱為DataRow

  • 將它們存儲在QVector<DataRow> ,例如,您可以按Date1對其進行排序。

  • 遍歷此QVector<DataRow>並找到與條件對應的元素。
  • 將那些DataRow添加到派生自QAbstractItemModel的類中。
  • 使用QTableView顯示從QAbstractItemModel派生的模型。

QTableWidget是重量級的,並不是真正為速度而構建的。 不過,使用很少的元素快速構建內容確實很方便。 QTableView是您想要的一個,它具有從QAbstractItemModel繼承的自定義模型。

然后,當用戶請求新輸入時,您只需擦除模型並重新啟動過程即可。 這不是最佳選擇,但用戶看不到區別。 隨時在此處添加更多邏輯以保留好元素,只刪除壞元素。

關於GUI凍結,始終避免這種情況的一種方法是將GUI線程與其他工作線程分開。 QThread文檔非常詳盡,可以幫助您設置類似的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM