Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: White Owl от Май 05, 2010, 20:09



Название: Отложенный action->trigger()?
Отправлено: White Owl от Май 05, 2010, 20:09
Есть QAction который в идеале должен запускаться пользователем и никогда из обработки другого action, можно только последовательно. Но так как этот action принадлежит основному GUI, то и запускать его надо из основного цикла...
Спрашивается, как это сделать?

emit action->trigger() просто запускает обработчик "здесь и сейчас".
qApp->postEvent(action , new QEvent(???), 0) тоже ни к чему не приводит, либо я не могу угадать нужный тип события.


Название: Re: Отложенный action->trigger()?
Отправлено: sendevent от Май 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();
    }
}
или я вообще не в ту степь?


Название: Re: Отложенный action->trigger()?
Отправлено: White Owl от Май 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();
    }
}
То все становится радостно и замечательно.