Russian Qt Forum

Qt => Вопросы новичков => Тема начата: QPeter от Февраль 25, 2014, 23:45



Название: Запрет на повторное открытие
Отправлено: QPeter от Февраль 25, 2014, 23:45
Ситуация следующая, если окно с кнопкой, при нажатии на которую открывается другое окно и как лучше реализовать запрет на повторное открытие, при нажатии на кнопку несколько раз?
Суть вопроса в том как правильно описать следующее условие:
Код:
if(форма открыта){
QMessedgeBox::information(this, "Нельзя открыть", "форма уже открыта");
}


Название: Re: Запрет на повторное открытие
Отправлено: kambala от Февраль 26, 2014, 01:07
можно булевый флажок завести, а можно сохранять указатель на виджет, который показываешь, и в слоте нажатия кнопки проверять не равен ли указатель нулю. указатель сделать QPointer и показываемому виджету выставить атрибут Qt::WA_DeleteOnClose


Название: Re: Запрет на повторное открытие
Отправлено: Old от Февраль 26, 2014, 06:04
и наверное лучше не показывать диалоги с предупреждениями, а дизаблить саму кнопку.


Название: Re: Запрет на повторное открытие
Отправлено: QPeter от Февраль 26, 2014, 13:54
А как нибудь вот так реализовать нельзя (имя формы spr)


Код:
void Widget::on_pushButton_3_clicked()
{
    spr *spravka= new spr(this);
    if(spravka->open())//вся проблема в этой строчке
    {
       QMessageBox::information(this, "Cant open","Форма уже открыта");
    }
    else {
        spravka->show();
    }
}


Название: Re: Запрет на повторное открытие
Отправлено: OKTA от Февраль 26, 2014, 14:09
Судя по написанному, ставите флаг в Widget типа
Код:
bool isOpen = false;
и в ф-ии нажатия кнопки делаете
Код:
if(isOpen) {...} else {isOpen = true; ...}
И дополнительно меняете флаг, когда форма закроется. Проще уж нечего придумать, если хочется просто.


Название: Re: Запрет на повторное открытие
Отправлено: kambala от Февраль 26, 2014, 14:18
new spr(this) создает новый объект, а тебе надо обращаться к существующему, поэтому я и говорил завести указатель


Название: Re: Запрет на повторное открытие
Отправлено: Igors от Февраль 26, 2014, 14:40
И дополнительно меняете флаг, когда форма закроется. Проще уж нечего придумать, если хочется просто.
А если кто-то еще его удалит? Вариант с QPointer самый четкий. Плюс проверка если указатель живой но окно invisible


Название: Re: Запрет на повторное открытие
Отправлено: OKTA от Февраль 26, 2014, 14:46
agree


Название: Re: Запрет на повторное открытие
Отправлено: QPeter от Февраль 26, 2014, 23:36
kambala а вам не сложно дописать код, самому как то не разобраться,.(  ???
Хотя бы примерно
Код:
void Widget::on_pushButton_3_clicked()
{
    spr *spravka= new spr;
    if()
    {
        QMessageBox::information(this, "Cant open","Форма уже открыта");
    }
    else {
        spravka->show();
    }
}


Название: Re: Запрет на повторное открытие
Отправлено: kambala от Февраль 26, 2014, 23:47
Код
C++ (Qt)
class Widget ...
{
...
   QPointer<spr> _spravka;
}
 
void Widget::on_pushButton_3_clicked()
{
   if (_spravka)
   {
       QMessageBox::information(this, "Can't open", "Форма уже открыта");
       // сделать окно справки активным
       _spravka->raise();
       _spravka->activateWindow();
   }
   else
   {
       _spravka = new spr;
       _spravka->setAttribute(Qt::WA_DeleteOnClose); // либо установку атрибута помести в конструктор справки
       _spravka->show();
   }
}


Название: Re: Запрет на повторное открытие
Отправлено: QPeter от Февраль 27, 2014, 00:19
kambala спасибо большое. Примерно разобрался)
 :)