2016-12-14 8 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 (например, отсортированного по дате 1?), Зацикливайтесь на этом, когда пользователь вводит даты, добавляйте их в QStandardItemModel и показываете их с помощью QTableView. Если пользователь изменяет эти даты, вы просто очистите QStandardItemModel и перезапустите процесс. Это должно работать легко для 30 000 рядов. –

ответ

0

Это трудно воспроизвести вашу проблему, но вот подход, я бы:

  • Создать собственный класс для хранения данных одного ряда, давайте назовем его DataRow.

  • Сохраните их в QVector<DataRow>, которые вы можете сортировать по дате 1, например.

  • Пройдите через это QVector<DataRow> и найдите элементы, соответствующие критериям.
  • Добавьте эти DataRow в класс, полученный из QAbstractItemModel.
  • показать эту модель из QAbstractItemModel с QTableView.

QTableWidget - тяжеловес и не был создан для скорости. Однако очень удобно создавать что-то быстро с несколькими элементами. QTableView - это тот, который вы хотите, с пользовательской моделью, унаследованной от QAbstractItemModel.

Затем, когда пользователь запрашивает новый ввод, вы можете просто стереть модель и перезапустить процесс. Это не оптимально, но пользователь не должен видеть разницу. Не стесняйтесь добавлять больше логики здесь, чтобы сохранить хорошие элементы и удалить только плохие.

О замораживании GUI, один из способов избежать этого, чтобы поток GUI был отделен от других рабочих потоков. Документация QThread является исчерпывающей и может помочь вам настроить что-то подобное.