Russian Qt Forum
Ноябрь 25, 2024, 04:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qthread QListWidget добавление элементов в таблицу с потока  (Прочитано 2851 раз)
folax
Гость
« : Декабрь 05, 2015, 13:29 »

Добрый день.

Делаю окно поиска файлов, разбил программу на два класса.
1) GUI окно с потоком
2) класс в котором происходит поиск файлов, в этом классе происходит генерация сигнала найденного файла типа QString и потом уже в класс GUI под средством слота передаю эту строку QListWidget.

Когда конкретные файлы то всё работает отлично, но когда я начинаю например поиск всех файлов в диске D: (много файлов), то окно подвисает, в конечном результате оно нормально всё потом отображает, все файлы с диска D:

Вопрос: как добиться чтобы в QListWidget добавлялись файлы при поиске так же плавно как и в TotalCommander, когда в нём ищешь то там файлы нормально без подвисаний добавляются.

Ниже участки кода:

1) блок вычисления

Код:
void filesSearchEngine::process()
{
    QStringList nameFilter;
    int starCnt = 0;
    if (m_strFileNames.contains("*")) {
        //если есть звёзды то считаем их
        for (int i = 0; i < m_strFileNames.size(); ++i)
            if (m_strFileNames.at(i) == '*')
                ++starCnt;
        //если количество звёзд равно 1 то создаём фильтр
        if (starCnt == 1 && m_strFileNames.at(0) == '*') {
            nameFilter.append(m_strFileNames);
            m_strFileNames.clear();
        }
        //если количество звёзд > 1;
        else if (starCnt == 2 && m_strFileNames == "*.*") {
            m_strFileNames.clear();
        }
    }
    QDirIterator it(m_dirPath, nameFilter, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
    while (it.hasNext()) {
        it.next();

        //break thread
        if (thread_Break)
            break;
        sync.lock();
        if (thread_Pause)
            pauseCond.wait(&sync);
        sync.unlock();

        emit currentSearchPatch(it.filePath());
        if (it.fileName().contains(m_strFileNames)) {
            emit foundFilePatch(it.filePath());
        }
        else if (m_strFileNames.isEmpty()) {
            emit foundFilePatch(it.filePath());
        }
    }
    emit currentSearchPatch(":");
    emit finished();
}

2) блок в GUI, слот добавления элементов в QListWidget

Код:
void wgtFilesSearch::addItemToFileList(QString data)
{
    m_foundFileList->addItem(data);
}

добавление в поток

Код:
//thread
    m_fileSearchThread = new QThread();
    m_searchEngine = new filesSearchEngine();           //<<search class
    m_searchEngine->moveToThread(m_fileSearchThread);

ниже стандартные коннекты

« Последнее редактирование: Декабрь 07, 2015, 12:32 от folax » Записан
folax
Гость
« Ответ #1 : Декабрь 07, 2015, 12:37 »

Отвечу сам на свой вопрос, начал искать в гугле по запросу QListWidget slow, и вывело меня на такой ответ.

The view tries to calculate the individual size of each new item. Since you probably don't need that, you can disable it and gain some speed with:

Код:
ui->listWidget->setUniformItemSizes(true);

Так как у меня при поиске в корне диска может быть больше 15000 элементов видимо происходил просчёт индивидуального каждого нового размера элемента.  В общем при этом флаге разморозился QListWidget и начал работать без проседаний.
Записан
popper
Гость
« Ответ #2 : Декабрь 07, 2015, 12:53 »

Элементы в дереве можно выводить по требованию.
Fetch More Example:
http://doc.qt.io/qt-5/qtwidgets-itemviews-fetchmore-example.html
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 21.