![]() |
|
![]() ![]() ![]() |
|
fux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Всем доброго дня!
Есть 100 приложений, каждое приложение имеет свое окно. Все их держать на экране некрасиво. Требуется скрыть окно (hide()) при потере фокуса. События типа QFocusEvent::lostFocus(), работают внутри одного процесса, при переходе с одного процесса на другой, похоже, нужны системмные события. Пршу совета. |
|||
|
||||
tzirechnoy |
|
||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Прекрати страдать фигнёй.
Что делать с окном при потере фокуса, решает пользователь (выбором настроек своего менеджэра окон).
Да-да, и это тожэ решают пользователь и программист менеджэра окон.
Не то, чтобы очень много -- но скорее всего всё-таки это спроектировано неправильно. |
||||||||
|
|||||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Я тоже так считаю. Судя по другим темаи ТС, имеется родительский процесс и куча дочерних. И каждый имеет свой GUI. Лучше GUI пусть имеет только родительский процесс, а дочерние пусть присылают ему сообщения, что нужно отобразить. |
|||
|
||||
fux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
На самом деле все несколько сложней. Во первых, родительский процесс не один, они строятся каскадом. Конечно, есть один глава семейства, но он не лезет в дела своих детей. Вот вторых, дочерние процессы появляются не в процессе проектирования, а в процессе эксплуатации, и что там, в будущем будет подключаться к системе неизвестно. Вообще это задача будущего систем управления.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Если все дочерние процессы делаешь ты, я бы сделал так:
Окно суперродителя - слева в док-виджете дерево, в центре - QMdiArea Каждый дочерний процесс при старте посылает сообщение суперродителю и в дереве появляется новый элемент, а в QMdiArea - новый QMdiSubWindow, связанные с этим процессом. Содержимое QMdiSubWindow создается через QUiLoader. Последующие сообщения будут менять содержимое формы. |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Если отображаемое достаточно мало -- то группировать его понесколько в одном окне, независимо от того, сколько процэссов его отображают (количество и родственные отношэния процэссов для вопрос группировки отображэния, на самом деле, вообще нерелевантны).
Если отображаемое достаточно велико -- то у тебя всё равне не уместится одновременно 100 окон на экране... |
|||
|
||||
fux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Все именно так и обстоит, вопрос не в том. За пультом монитора будет сидеть девочка оператор, которая не обязана следить за расположением и закрытием окон. Поэтому панель задач будет забита ярлыками, которые кроме путаницы ничего не дают. Если оператор не пользуется окном оно просто должно исчезнуть.
|
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Свернуть и спрятать MDI-окно будет просто, а открыть его можно через дерево. А процессы, у которых нет своего окна, вроде как на панели задач не отображаются (но есть в Диспетчере задач, который Ваша девочка-оператор открывать не будет).
Добавлено @ 15:58 А если хотите, чтобы дочерние процессы все-таки имели окна. Обычно main.cpp выглядит так:
Переделайте так:
правда не знаю будет ли оставаться значок в панели задач пока нет окон. Это сообщение отредактировал(а) math64 - 9.11.2015, 16:03 |
||||
|
|||||
fux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Вот так сработало
qApp->installEventFilter(this); //--------обнаружить потерю фокуса---------------------------------- bool MainWindow::eventFilter( QObject * o, QEvent * e ) // { if(((QFocusEvent*)e)->lostFocus()) { for(int i=0;i < qApp->allWidgets().count();i++) { if(qApp->allWidgets()[i]->hasFocus()) return false; //свой виджет } this->hide(); //чужой } return false; } |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 1 Всего: 16 |
Ну да, если с панэли задач будут исчезать произвольные окна -- то это, конечно, резко уменьшыт путаницу. Ещё раз, медленно: Вы херню делаете. Полную и абсолютную херню. Просто прекратите это делать! Создатели дажэ весьма непритязательного и корявенького виндового wm сделали всё на таком высоком уровне, который Вам в данный момент недоступен, и в ближайшые годы доступен не будет. Не пытайтесь делать за них их работу. Можэте попытаться изменить как-то своё приложэние, чтобы подстроиться под привычные стандарты, а делать наоборот -- это не ваша сильная сторона! |
|||
|
||||
fux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Чао фантик!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |