crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Рекурсивный перебор + QLabel
breeve
  опции профиля:
сообщение 25.1.2011, 20:43
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

Спасибо сказали: 9 раз(а)




Репутация:   1  


Есть рекурсивная функция которая увеличивает переменную. Эта переменная в течении секунд 10-15 увеличивается, затем остается неизменной.
Необходимо чтобы эта переменная выводилась в лэйбл все время, т.е пока функция подсчитывает, видеть какое сейчас значение.
Я сделал чтобы при запуске функции он выставлял значение в лэйбл, но он меняет так быстро что окно не появляется пока функция не закончит работу.
Как сделать чтобы окно открылось а в нем изменялось число?

Сообщение отредактировал breeve - 25.1.2011, 20:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 26.1.2011, 8:58
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Ну можно попробовать поставить задержку (через таймер) на начало работы функции, чтобы успело все отразиться, а потом из функции делать вызов qApp->processEvents().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 27.1.2011, 14:00
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


попробуй при каждой итерации:
qlabel->repaint()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 27.1.2011, 15:20
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

Спасибо сказали: 9 раз(а)




Репутация:   1  


Ничего не получается.
Как я понял дело не во времени, сделал условие чтобы выводил когда число кратно 1000 т.е ну это примерно раз в 1-2 сек. Он все равно не выводит. Причем ту переменную которая не меняется он выводит, а которые меняються нет.
Думаю попробовать через QThead.
А можно как нибудь создать дополнительный поток не создавая при это класс?

Code
 Конструктор:
{
    ...
    vLay = new QVBoxLayout;
    info = new QLabel;
    vLay->addWidget(info);
    setLayout(vLay);

//  showInfo(str_path);
    this->show();
    recSearch(str_path);
    showInfo(str_path);
}

   ....
   ....

// Функция которая подсчитывает
recSearch(QString s):
{
    ...
    //this->repaint();
    //info->repaint();
    ...
    foreach(..)
    {
        if(AllFiles % 1000 == 0)
        {
           showInfo(str_path);
           info->repaint();
           this->repaint();
        }
        if( ... )
               recSearch(...);
        else if( ... )
               incFiles(SystemInfo::Audio); // увеличивает переменную      
     }
    //showInfo(str_path);
    return true;
}


showInfo(QString dir)
{
    QString result = "";
    result += "Path: " + dir + "\n";
    if(showAudio)
{
    result += "Audio:\t" +
              QString::number(AudioFiles, 10) +
              " files \t" +
              QString::number(printShortSize(sAudioFiles)) +
              printTextSize(sAudioFiles) + "\n";
}
    result += "All:\t" +
              QString::number(AllFiles, 10) +
              " files \t" +
              QString::number(printShortSize(sAllFiles)) +
              printTextSize(sAllFiles) + "\n";
    qDebug() << result;
    info->setText(result);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.1.2011, 15:26
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Так processEvents вызывается где-нибудь из рекурсивной функции или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 27.1.2011, 15:50
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

Спасибо сказали: 9 раз(а)




Репутация:   1  


Цитата(Rocky @ 26.1.2011, 8:58) *
Ну можно попробовать поставить задержку (через таймер) на начало работы функции, чтобы успело все отразиться, а потом из функции делать вызов qApp->processEvents().

Если я правильно понял тогда получится что перед тем как запуститься функция, разок покажет Лэйбл с нулями, и затем функция начнет работать. И только после окончания функции он снова обновит Лэйбл.
Нужно чтобы было примерно как, если в бесконечном цикле прибавлять по единичке к переменной, и затем через qDebug() ее выводить. Одна цифра будет сменяться другой оч быстро. Пытаюсь тоже самое только лэйбл. выводить.

Цитата(Rocky @ 27.1.2011, 15:26) *
Так processEvents вызывается где-нибудь из рекурсивной функции или нет?

Сделал все заработало. О_о Только не совсем понимаю как работает этот процесс ивентс..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.1.2011, 16:33
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(breeve @ 27.1.2011, 15:50) *
Только не совсем понимаю как работает этот процесс ивентс

Ну, можно в assistant-е почитать... ;)

Доставляет все сообщения в главный цикл приложения. Отличный способ избавиться от "зависаний" программы во время совершения длительных операций.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 15:31