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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запрет на повторное открытие  (Прочитано 6399 раз)
QPeter
Гость
« : Февраль 25, 2014, 23:45 »

Ситуация следующая, если окно с кнопкой, при нажатии на которую открывается другое окно и как лучше реализовать запрет на повторное открытие, при нажатии на кнопку несколько раз?
Суть вопроса в том как правильно описать следующее условие:
Код:
if(форма открыта){
QMessedgeBox::information(this, "Нельзя открыть", "форма уже открыта");
}
« Последнее редактирование: Февраль 26, 2014, 00:07 от QPeter » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Февраль 26, 2014, 01:07 »

можно булевый флажок завести, а можно сохранять указатель на виджет, который показываешь, и в слоте нажатия кнопки проверять не равен ли указатель нулю. указатель сделать QPointer и показываемому виджету выставить атрибут Qt::WA_DeleteOnClose
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Февраль 26, 2014, 06:04 »

и наверное лучше не показывать диалоги с предупреждениями, а дизаблить саму кнопку.
Записан
QPeter
Гость
« Ответ #3 : Февраль 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();
    }
}
Записан
OKTA
Гость
« Ответ #4 : Февраль 26, 2014, 14:09 »

Судя по написанному, ставите флаг в Widget типа
Код:
bool isOpen = false;
и в ф-ии нажатия кнопки делаете
Код:
if(isOpen) {...} else {isOpen = true; ...}
И дополнительно меняете флаг, когда форма закроется. Проще уж нечего придумать, если хочется просто.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Февраль 26, 2014, 14:18 »

new spr(this) создает новый объект, а тебе надо обращаться к существующему, поэтому я и говорил завести указатель
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 26, 2014, 14:40 »

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

agree
Записан
QPeter
Гость
« Ответ #8 : Февраль 26, 2014, 23:36 »

kambala а вам не сложно дописать код, самому как то не разобраться,.(  Непонимающий
Хотя бы примерно
Код:
void Widget::on_pushButton_3_clicked()
{
    spr *spravka= new spr;
    if()
    {
        QMessageBox::information(this, "Cant open","Форма уже открыта");
    }
    else {
        spravka->show();
    }
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #9 : Февраль 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();
   }
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
QPeter
Гость
« Ответ #10 : Февраль 27, 2014, 00:19 »

kambala спасибо большое. Примерно разобрался)
 Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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