我需要通过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 :(得分:0)
很难重现你的问题,但这是我要采取的方法:
创建一个自定义类来存储一行数据,让我们调用它
DataRow
。
将这些内容存储在QVector<DataRow>
中,您可以按Date1排序。
QVector<DataRow>
并找到与条件对应的元素。DataRow
添加到从QAbstractItemModel
。QAbstractItemModel
QTableView
的此模型
QTableWidget
是重量级的,并不是真正为速度而建。尽管用很少的元素快速构建东西真的很方便。
QTableView
是您想要的,使用从QAbstractItemModel
继承的自定义模型。
然后,当用户请求新输入时,您可以擦除模型并重新启动该过程。这不是最佳选择,但用户不应该看到差异。随意添加更多逻辑以保留好元素,只删除不良元素。
关于GUI冻结,总是避免这种情况的一种方法是将GUI线程与其他工作线程分开。 QThread文档非常详尽,可以帮助您设置类似的内容。