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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление виджета во время длительных вычислений  (Прочитано 7971 раз)
Winstrol
Гость
« : Май 13, 2005, 21:53 »

Вообщем такой вопрос. Пытаюсь обновлять QlistBox во время вычислений, да не получается.

Так работает:
Код:

void Form1::pushButton1_clicked()
{
    new QListBoxText(listBox1,"1222321");
    new QListBoxText(listBox1,"123123");
    new QListBoxText(listBox1,"13345634");
//vvvvvvvvvvv
    for (int i=0;i<10;++i) qApp->eventLoop()->processEvents(  QEventLoop::WaitForMore | QEventLoop::ExcludeUserInput );
//^^^^^^^^^^^    
    //Эмуляция длительных вычислений
    while(1);
}

То есть в листбокс заносятся новые элементы и их видно.

А так нет:
Код:

void Form1::pushButton1_clicked()
{
    new QListBoxText(listBox1,"1222321");
    new QListBoxText(listBox1,"123123");
    new QListBoxText(listBox1,"13345634");
//vvvvvvvvvvv
    for (int i=0;i<1;++i) qApp->eventLoop()->processEvents(  QEventLoop::WaitForMore | QEventLoop::ExcludeUserInput );
//^^^^^^^^^^^    
    //Эмуляция длительных вычислений
    while(1);
}


Нужен универсальный способ, не зависящий от &laquo;магической&raquo; константы 10.
ЗЫ QT3.1.2
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Май 13, 2005, 23:07 »

попробуй

Цитировать
void QApplication::processEvents ()
Processes pending events, for 3 seconds or until there are no more events to process, whichever is shorter.
You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).
Записан
Winstrol
Гость
« Ответ #2 : Май 13, 2005, 23:20 »

Цитата: "Admin"
попробуй

Цитировать
void QApplication::processEvents ()
Processes pending events, for 3 seconds or until there are no more events to process, whichever is shorter.
You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).


Увы не канает.
Код:
void QApplication::processEvents( int maxtime )
{
    eventLoop()->processEvents( QEventLoop::AllEvents, maxtime );
}


Кстати, народ, протестируйте пожалуйста на других версиях.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #3 : Май 14, 2005, 10:14 »

тогда используй тред!!
Записан
Winstrol
Гость
« Ответ #4 : Май 14, 2005, 20:10 »

Пока вот так работает. Правда я пока не до конца уверен, что 100% правильно.
Код:

do{
    qApp->eventLoop()->activateTimers();
    qApp->eventLoop()->processEvents(  QEventLoop::WaitForMore | QEventLoop::ExcludeUserInput );
}while (qApp->eventLoop()->hasPendingEvents() );

Цитата: "Admin"
тогда используй тред!!

Пример кинь. Интерактивности с пользователем у меня по логике быть не должно. Только вывод на экран.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #5 : Май 14, 2005, 20:38 »

так наследуешся от QThread

в методе run заполняешь свой QListBox
Записан
Keiko
Гость
« Ответ #6 : Май 15, 2005, 03:18 »

а кто даст гарантию, что заполнение QListVeiw выполнится до того, как начнётся while(1) ?
Записан
Sergeich
Гость
« Ответ #7 : Май 16, 2005, 15:03 »

Цитата: "Admin"
так наследуешся от QThread
в методе run заполняешь свой QListBox

Нельзя напрямую юзать методы виджетов из боковых ниток!!!

Цитировать
Threads that wish to display data in a widget cannot modify the widget directly, so they must post an event to the widget using QApplication::postEvent(). The event will be delivered later on by the GUI thread.

(Qt Reference Documentation, Thread Support in Qt, Thread-safe Event Posting)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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