[英]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.