crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Создание только одного экземпляра окна
breeve
  опции профиля:
сообщение 27.1.2011, 16:49
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

Спасибо сказали: 9 раз(а)




Репутация:   1  


Как сделать чтобы окно можно было открыть только один раз.
Есть основное окно, и модальное диалоговое. У основного класса есть слот который создает диалоговое.
Если два раза нажать кнопку, будет два окна. Как перед созданием проверять есть ли уже такое окно, но только таким образом что если такого окна еще нет чтобы он не повис))?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 27.1.2011, 16:59
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


дык если оно модальное, оно не должно давать возможность тыкать в родительское окно или вообще в любые окна приложения, смотря что задано в setWindowModality
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 27.1.2011, 17:04
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

Спасибо сказали: 9 раз(а)




Репутация:   1  


Цитата(abc @ 27.1.2011, 16:59) *
дык если оно модальное, оно не должно давать возможность тыкать в родительское окно или вообще в любые окна приложения, смотря что задано в setWindowModality


Но у главного приложения нету окна, оно висит всегда в трее и чтобы открыть диалоговое окошко, то надо тыкнуть на трей. А если открыто окно не важно модальное не модальное, все равно на трей можно тыкнуть и открыть еще одно окно.

Как вариант можно обрабатывать клики мышкой по иконке и затем смотреть если открыто хоть одно окно, то не открывать менюшку, и сделать открытое окно активным. Если все окна закрыты то позволить открыть меню. Только вот как это обрабатывать не знаю, нажатия могу, а вот как узнать какие сейчас окна открыты, и как специально не открывать контексное меню.

Сообщение отредактировал breeve - 27.1.2011, 17:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 27.1.2011, 17:11
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


а нельзя создать это диалоговое окно 1 раз в конструкторе, а по кнопке просто делать show()?

а closeEvent переопределить - написать там hide()

даже не надо трогать closeevent, это я погорячился
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 27.1.2011, 17:20
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 188
Регистрация: 26.12.2009
Пользователь №: 1336

Спасибо сказали: 9 раз(а)




Репутация:   1  


Цитата(abc @ 27.1.2011, 17:11) *
а нельзя создать это диалоговое окно 1 раз в конструкторе, а по кнопке просто делать show()?

а closeEvent переопределить - написать там hide()

даже не надо трогать closeevent, это я погорячился


Так не получится поскольку таких окон несколько. И открыв одно окно меняються параметры для открытия другого. Можно конечно и так, но тогда придется много чего переделывать.

Сообщение отредактировал breeve - 27.1.2011, 17:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 27.1.2011, 17:27
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


сделать глобальную переменную есть/нет окно, в кнопке проверять эту переменную и соответственно создавать или не создавать окно, при закрытии диалогового окна в closeEvent переменную изменять
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.1.2011, 19:05
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Что-то не понятно ничего.... Пора домой идти)

Это диалоговое окно - оно экзэмпляр одного класса? Вынести в мемберы главного класса указатель на него. В конструкторе главного класса присвоить NULL. Когда нужно показать это окно - если указатель не NULL, удалять и создавать заново. Если NULL - то просто создавать. Или нужно вообще не показывать контекстное меню если окно открыто? Как показываешь тогда это контекстное меню? Если ручками, то перед показом делать то что выше написал. Если через setContextMenu (или как она там называется), то видимо нужно ставить какой-нить eventFilter.... Как-то так....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.1.2011, 20:52
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


нужно не глобальную, а статическую переменную :) Будет одно единственное окно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.1.2011, 21:17
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(breeve @ 27.1.2011, 19:04) *
Как вариант можно обрабатывать клики мышкой по иконке и затем смотреть если открыто хоть одно окно, то не открывать менюшку, и сделать открытое окно активным. Если все окна закрыты то позволить открыть меню.
так обычно и делают.
Цитата(Rocky @ 27.1.2011, 21:05) *
В конструкторе главного класса присвоить NULL. Когда нужно показать это окно - если указатель не NULL, удалять и создавать заново. Если NULL - то просто создавать.
угу, только и NULL не нужен. достаточно нуля.
if (child){
    child->show(); // если вдруг прятали
    child->rise(); // чтоб поверх активного стало
}else{
    child = new Modal(...)
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.1.2011, 21:55
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Litkevich Yuriy, а в чем отличие (может даже с точки зрения безопастности)
myclass *ptr = NULL;

от
myclass *ptr = 0;

? (интересно потому, что часто вижу именно инициализацию нулем)
Просто я например, всегда, если указатель инициализирую - то NULL, если просто переменную - то 0. (путь даже где-то и стоит #define NULL 0).

Цитата(breeve @ 27.1.2011, 18:20) *
Так не получится поскольку таких окон несколько. И открыв одно окно меняються параметры для открытия другого.

Так классов окон у тебя несколько, а нужно чтобы в одно время было открыто только одно окно? Ну, тогда все то же, что ребята выше писали + запихать указатели в контейнер например (если окон много). Если не много, то просто указатели держать как переменные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 4:04