Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Winstrol от Май 13, 2005, 21:53



Название: Обновление виджета во время длительных вычислений
Отправлено: 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 от Май 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 от Май 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 от Май 14, 2005, 10:14
тогда используй тред!!


Название: Обновление виджета во время длительных вычислений
Отправлено: Winstrol от Май 14, 2005, 20:10
Пока вот так работает. Правда я пока не до конца уверен, что 100% правильно.
Код:

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

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

Пример кинь. Интерактивности с пользователем у меня по логике быть не должно. Только вывод на экран.


Название: Обновление виджета во время длительных вычислений
Отправлено: Admin от Май 14, 2005, 20:38
так наследуешся от QThread

в методе run заполняешь свой QListBox


Название: Обновление виджета во время длительных вычислений
Отправлено: Keiko от Май 15, 2005, 03:18
а кто даст гарантию, что заполнение QListVeiw выполнится до того, как начнётся while(1) ?


Название: Обновление виджета во время длительных вычислений
Отправлено: Sergeich от Май 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)