2016-12-14 353 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文档是详尽的,可以帮助你设置这样的东西。