Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Barmaglodd от Октябрь 24, 2008, 15:03



Название: Как свернуть все родительские окна?
Отправлено: Barmaglodd от Октябрь 24, 2008, 15:03
Есть главное окно программы, в процессе работы открывается дочернее модальное окно. Если нажать на кнопочку свернуть у дочернего, останется открытым родительское, которое не принимает событий от клавиатуры и мыши. На панели задач отображаются оба окна, но пользователи в ступоре :( Хочется, чтобы на панели задач была одна кнопочка для приложения, независимо от количества открытых окон, и ,при нажатии кнопки свернуть у активного окна, сворачивались все родительские.

Всё описанное под виндой :)


Название: Re: Как свернуть все родительские окна?
Отправлено: pastor от Октябрь 24, 2008, 15:07
Мне кажеться MDI интерфейс вам поможет. Посмотрите пример QTDIR\examples\mainwindows\mdi


Название: Re: Как свернуть все родительские окна?
Отправлено: Barmaglodd от Октябрь 24, 2008, 15:27
Спасибо, я почему-то в эту сторону совсем не думал. Мне даже QStackedWidget может помочь.


Название: Re: Как свернуть все родительские окна?
Отправлено: lit-uriy от Октябрь 24, 2008, 15:34
2 Barmaglodd, дочернему окну надо родителя задавать, тогда дочернего окна на панели задач не будет.


Название: Re: Как свернуть все родительские окна?
Отправлено: Barmaglodd от Октябрь 25, 2008, 08:59
2 lit-uriy, точно :) Но проблема со сворачиванием всего приложения остаётся, родительское окно всё равно висит, а дочернее в маленькую полосочку в углу экрана сворачивается.


Название: Re: Как свернуть все родительские окна?
Отправлено: Alex03 от Октябрь 25, 2008, 09:43
А зачем разрешать сворачивать модальный диалог?


Название: Re: Как свернуть все родительские окна?
Отправлено: Barmaglodd от Октябрь 25, 2008, 10:14
А раньше и нельзя было, но попросили, т.к. иначе до рабочего стола не добраться (Win+D, кнопочка "свернуть всё", поиск через меню пуск и т.п. слишком "сложно"). Может это мой прощёт.
Приложение построено так: главное окно в нём список основных действий, пользователь выбирает нужное, открывается модальный диалог, где дальше продолжается работа.


Название: Re: Как свернуть все родительские окна?
Отправлено: Alex03 от Октябрь 25, 2008, 10:20
Можно hide()-ить главное окно перед exec()-ом модального и show()-ить после exec()-а... правда кривоватостью попахивает. :)



Название: Re: Как свернуть все родительские окна?
Отправлено: Barmaglodd от Октябрь 25, 2008, 10:36
Можно, но это крайнее средство :) Я скорее сделаю QStackedWidget на главной форме и в нём буду показывать диалог.


Название: Re: Как свернуть все родительские окна?
Отправлено: lit-uriy от Октябрь 25, 2008, 11:56
2 Barmaglodd, мысль в слух:
Ловить событие в классе диалога, о сворачивании, если родитель задан, то вызывать у последнего метод сворачивающий его на панель задач.



Название: Re: Как свернуть все родительские окна?
Отправлено: Tonal от Октябрь 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)
 
Ну или в базовый класс прописать. :)


Название: Re: Как свернуть все родительские окна?
Отправлено: Barmaglodd от Октябрь 27, 2008, 08:54
Как раз собирался на 4.4 переходить, если там всё работает "из коробки", то это ещё один аргумент в пользу перехода :)


Название: Re: Как свернуть все родительские окна?
Отправлено: Barmaglodd от Ноябрь 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?