Russian Qt Forum

Qt => Вопросы новичков => Тема начата: folax от Декабрь 05, 2015, 13:29



Название: Qthread QListWidget добавление элементов в таблицу с потока
Отправлено: 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);

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



Название: Re: Qthread QListWidget добавление элементов в таблицу с потока
Отправлено: folax от Декабрь 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 и начал работать без проседаний.


Название: Re: Qthread QListWidget добавление элементов в таблицу с потока
Отправлено: popper от Декабрь 07, 2015, 12:53
Элементы в дереве можно выводить по требованию.
Fetch More Example:
http://doc.qt.io/qt-5/qtwidgets-itemviews-fetchmore-example.html