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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как свернуть все родительские окна?  (Прочитано 13135 раз)
Barmaglodd
Гость
« : Октябрь 24, 2008, 15:03 »

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

Всё описанное под виндой Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Октябрь 24, 2008, 15:07 »

Мне кажеться MDI интерфейс вам поможет. Посмотрите пример QTDIR\examples\mainwindows\mdi
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Barmaglodd
Гость
« Ответ #2 : Октябрь 24, 2008, 15:27 »

Спасибо, я почему-то в эту сторону совсем не думал. Мне даже QStackedWidget может помочь.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Октябрь 24, 2008, 15:34 »

2 Barmaglodd, дочернему окну надо родителя задавать, тогда дочернего окна на панели задач не будет.
Записан

Юра.
Barmaglodd
Гость
« Ответ #4 : Октябрь 25, 2008, 08:59 »

2 lit-uriy, точно Улыбающийся Но проблема со сворачиванием всего приложения остаётся, родительское окно всё равно висит, а дочернее в маленькую полосочку в углу экрана сворачивается.
Записан
Alex03
Гость
« Ответ #5 : Октябрь 25, 2008, 09:43 »

А зачем разрешать сворачивать модальный диалог?
Записан
Barmaglodd
Гость
« Ответ #6 : Октябрь 25, 2008, 10:14 »

А раньше и нельзя было, но попросили, т.к. иначе до рабочего стола не добраться (Win+D, кнопочка "свернуть всё", поиск через меню пуск и т.п. слишком "сложно"). Может это мой прощёт.
Приложение построено так: главное окно в нём список основных действий, пользователь выбирает нужное, открывается модальный диалог, где дальше продолжается работа.
Записан
Alex03
Гость
« Ответ #7 : Октябрь 25, 2008, 10:20 »

Можно hide()-ить главное окно перед exec()-ом модального и show()-ить после exec()-а... правда кривоватостью попахивает. Улыбающийся

Записан
Barmaglodd
Гость
« Ответ #8 : Октябрь 25, 2008, 10:36 »

Можно, но это крайнее средство Улыбающийся Я скорее сделаю QStackedWidget на главной форме и в нём буду показывать диалог.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Октябрь 25, 2008, 11:56 »

2 Barmaglodd, мысль в слух:
Ловить событие в классе диалога, о сворачивании, если родитель задан, то вызывать у последнего метод сворачивающий его на панель задач.

Записан

Юра.
Tonal
Гость
« Ответ #10 : Октябрь 26, 2008, 09:45 »

У меня, в 4.4.1 приложение само сворачивается при сворачивании модального диалога.
Раньше был код сворачивания руками - я его выкинул. Улыбающийся

Но, если он кого-то интересует, то не жалко, вот:
Код
Python
def minimizeApp(win, event):
 u"""
 Сворачивание главного окна из подченённого при сворачивании подчинённого
 @param win подченённое окно
 @param event событие изменения
 @return минимизмция произошла
 """

 if event.type() == QtCore.QEvent.WindowStateChange:
   state = win.windowState()
   if state == QtCore.Qt.WindowMinimized:
     event.ignore()
     from src.FormMain import FormMain
     def minimizeAll():
       for top_win in QtGui.QApplication.topLevelWidgets():
         if isinstance(top_win, FormMain):
           top_win.showMinimized()
     QtCore.QTimer.singleShot(0, minimizeAll)
     return True
 return False
 
В диалог требуется вставить шаблонный обработчик:
Код
Python
class FormEditPhysPerson(QtGui.QDialog):
...
 @QtCore.pyqtSignature('QEvent*')
 def changeEvent(self, event):
   u'Отработка события смены состояния окна'
   if not minimizeApp(self, event):
     QtGui.QDialog.changeEvent(self, event)
 
Ну или в базовый класс прописать. Улыбающийся
« Последнее редактирование: Ноябрь 26, 2008, 09:32 от Tonal » Записан
Barmaglodd
Гость
« Ответ #11 : Октябрь 27, 2008, 08:54 »

Как раз собирался на 4.4 переходить, если там всё работает "из коробки", то это ещё один аргумент в пользу перехода Улыбающийся
Записан
Barmaglodd
Гость
« Ответ #12 : Ноябрь 25, 2008, 08:42 »

У меня, в 4.4.1 приложение само сворачивается при сворачивании модального диалога.
Qt 4.4.3. Win 2000 SP4, Win XP SP2, Win 2003 Server R2 везде не сворачивается Грустный

Сделал в базовом классе
Код
C++ (Qt)
void CenteredDialog::changeEvent(QEvent* e)
{
if(e->type()==QEvent::WindowStateChange)
{
if(isMinimized() && parentWidget())
parentWidget()->showMinimized();
}
QDialog::changeEvent(e);
}
 
Родительское окно сворачивает, но модальный диалог сворачивается в полоску в углу экрана Грустный
Может это из-за того, что у меня главное окно потомок QDialog, а не QMainWindow?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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