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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отложенный action->trigger()?  (Прочитано 2289 раз)
White Owl
Гость
« : Май 05, 2010, 20:09 »

Есть QAction который в идеале должен запускаться пользователем и никогда из обработки другого action, можно только последовательно. Но так как этот action принадлежит основному GUI, то и запускать его надо из основного цикла...
Спрашивается, как это сделать?

emit action->trigger() просто запускает обработчик "здесь и сейчас".
qApp->postEvent(action , new QEvent(Непонимающий), 0) тоже ни к чему не приводит, либо я не могу угадать нужный тип события.
Записан
sendevent
Гость
« Ответ #1 : Май 05, 2010, 21:49 »

QAction::trigger() - это слот:
emit action->trigger();
не совсем понятно, чего надо... я так понял, есть некий action0, который запускает <нечто> и пока это <нечто> работает, нельзя вызывать action1, а надо дождаться завершения обработки? тогда чтото вроде:
Код:
//-- bool SomeClass::m_bRequestedAct1;
//-- bool SomeClass::m_bAct0IsActive;

void SomeClass::processAction0()
{
    m_bAct0IsActive = true;
    //-- чтото долго обрабатываем, скорее всего в цикле,
    //-- поэтому не забываем про:
    qApp->processEvents();
    ...
    m_bAct0IsActive = false;
}

void SomeClass::on_action0_triggered( bool on )
{
    processAction0();
   
    if( m_bRequestedAct1 )
    {
        m_bRequestedAct1 = false;
        processAction1();
    }
}

void SomeClass::on_action1_triggered( bool on )
{
    if( m_bAct0IsActive )
    {
        m_bRequestedAct1 = true;
    }
    else
    {
        processAction1();
    }
}
или я вообще не в ту степь?
Записан
White Owl
Гость
« Ответ #2 : Май 05, 2010, 23:20 »

не совсем понятно, чего надо... я так понял, есть некий action0, который запускает <нечто> и пока это <нечто> работает, нельзя вызывать action1, а надо дождаться завершения обработки? тогда чтото вроде:
.....
или я вообще не в ту степь?
В ту. Так действительно можно решить задачу.
Проблема только в том, что мое <нечто> модифицирует GUI, и прежде чем запускать processAction1() надо дождаться пока все виджеты отрисуются и пересчитают свои размеры...

А впрочем, если сделать примерно так:
Код:
void SomeClass::on_action0_triggered( bool on )
{
    m_bAct0IsActive = true;
    changeGUI();
    foreach( QWidget *widget, updatedWidgets) widget->show();
    qApp->processEvents();
    m_bAct0IsActive = false;

    if( m_bRequestedAct1 )
    {
        m_bRequestedAct1 = false;
        processAction1();
    }
}
То все становится радостно и замечательно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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