Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sr.Gallardo от Июль 02, 2013, 15:48



Название: Как сделать кнопки временно неактивными?
Отправлено: Sr.Gallardo от Июль 02, 2013, 15:48
Пишу морской бой на qt.Пытаюсь реализовать задержку. На время задержки нужно сделать кнопки нерабочими, короче сделал так:
//slot changeCompButtons() вызывается по нажатию кнопки
void Widget::changeCompButtons(){
//сразу делаю кнопки не кликабельными
    for(int i=0 ; i<10 ; i++)
    {
        for(int j=0 ; j<10 ; j++)
        {
            buttonsComp[j]->setEnabled(false);
         
        }
    }
//
    QPushButton *btn=(QPushButton*)sender();

    int theRow=btn->objectName().toInt()/10;
    int theCol=btn->objectName().toInt()%10;
    if(computerMap[theRow][theCol]==1)
    {
        computerMap[theRow][theCol]=3;
        playerScore->setText(QString::number(playerScore->text().toInt()+10));
    }
    pl=true;
    bool res=isKilled(theRow,theCol);
    comp=true;
    if(firstStep==1)
    {
        time.restart();
        while(time.elapsed()<1000)
        {
           
        }
    }
    if(firstStep==0)
    {
       time.start();
       while(time.elapsed()<1000)
       {
         
       }
       firstStep++;
    }

     
     AI();
    //в конце возвращаю кнопки в рабочее состояние
     for(int i=0 ; i<10 ; i++)
     {
         for(int j=0 ; j<10 ; j++)
         {
             buttonsComp[j]->setEnabled(true);

         }
     }
}
Но прикол в том, что если я нажму на кнопку во время задержки, спустя секунду слот все равно выполняется. Как же сделать кнопки нерабочими на определенное время?


Название: Re: Как сделать кнопки временно неактивными?
Отправлено: kambala от Июль 02, 2013, 15:58
у нас год морского боя выдался :D

для оформления кода существует тэг code с параметром cpp

введи bool переменную, которая будет означать выполняется ли слот, и поставь на нее проверку в самом начале:
Код
C++ (Qt)
void Widget::changeCompButtons()
{
   if (_isWaiting)
       return;
 
   _isWaiting = true;
   ...
   _isWaiting = false;
}


Название: Re: Как сделать кнопки временно неактивными?
Отправлено: Sr.Gallardo от Июль 02, 2013, 16:26
Спасибо за ответ. Сделал как вы и сказали, но странно, не помогло. Слот по-прежнему выполняется если кликну по кнопке во время задержки.


Название: Re: Как сделать кнопки временно неактивными?
Отправлено: lit-uriy от Июль 02, 2013, 22:21
вообще сигнал от неактивной кнопки не посылается.
Но, в приведённом коде в одной функции, кнопки делались неактивными, а потом опять активные (по сути состояния-то они и не меняли, т.к. в цикл обработки событий возврата не было).


Название: Re: Как сделать кнопки временно неактивными?
Отправлено: Sr.Gallardo от Июль 03, 2013, 00:03
да, но как мне все-таки сделать кнопки неактивными? изменить состояние кнопок вне слота? но как?


Название: Re: Как сделать кнопки временно неактивными?
Отправлено: kambala от Июль 03, 2013, 01:01
вставь после цикла отключения кнопок qApp->processEvents()


Название: Re: Как сделать кнопки временно неактивными?
Отправлено: Fregloin от Июль 03, 2013, 12:32
blockSignals?


Название: Re: Как сделать кнопки временно неактивными?
Отправлено: Sr.Gallardo от Июль 03, 2013, 12:37
вставь после цикла отключения кнопок qApp->processEvents()
спасибо, помогло наконец-то! вставил несколько  qApp->processEvents() в слот и заработало.