| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Как обнаружить потерю фокуса? |
| Автор: fux 6.11.2015, 14:31 |
| Всем доброго дня! Есть 100 приложений, каждое приложение имеет свое окно. Все их держать на экране некрасиво. Требуется скрыть окно (hide()) при потере фокуса. События типа QFocusEvent::lostFocus(), работают внутри одного процесса, при переходе с одного процесса на другой, похоже, нужны системмные события. Пршу совета. |
| Автор: tzirechnoy 6.11.2015, 20:43 | ||||||||
Прекрати страдать фигнёй.
Что делать с окном при потере фокуса, решает пользователь (выбором настроек своего менеджэра окон).
Да-да, и это тожэ решают пользователь и программист менеджэра окон.
Не то, чтобы очень много -- но скорее всего всё-таки это спроектировано неправильно. |
| Автор: fux 9.11.2015, 10:54 |
| На самом деле все несколько сложней. Во первых, родительский процесс не один, они строятся каскадом. Конечно, есть один глава семейства, но он не лезет в дела своих детей. Вот вторых, дочерние процессы появляются не в процессе проектирования, а в процессе эксплуатации, и что там, в будущем будет подключаться к системе неизвестно. Вообще это задача будущего систем управления. |
| Автор: math64 9.11.2015, 12:48 |
| Если все дочерние процессы делаешь ты, я бы сделал так: Окно суперродителя - слева в док-виджете дерево, в центре - QMdiArea Каждый дочерний процесс при старте посылает сообщение суперродителю и в дереве появляется новый элемент, а в QMdiArea - новый QMdiSubWindow, связанные с этим процессом. Содержимое QMdiSubWindow создается через QUiLoader. Последующие сообщения будут менять содержимое формы. |
| Автор: tzirechnoy 9.11.2015, 12:49 |
| Если отображаемое достаточно мало -- то группировать его понесколько в одном окне, независимо от того, сколько процэссов его отображают (количество и родственные отношэния процэссов для вопрос группировки отображэния, на самом деле, вообще нерелевантны). Если отображаемое достаточно велико -- то у тебя всё равне не уместится одновременно 100 окон на экране... |
| Автор: fux 9.11.2015, 14:10 |
| Все именно так и обстоит, вопрос не в том. За пультом монитора будет сидеть девочка оператор, которая не обязана следить за расположением и закрытием окон. Поэтому панель задач будет забита ярлыками, которые кроме путаницы ничего не дают. Если оператор не пользуется окном оно просто должно исчезнуть. |
| Автор: math64 9.11.2015, 15:50 | ||||
| Свернуть и спрятать MDI-окно будет просто, а открыть его можно через дерево. А процессы, у которых нет своего окна, вроде как на панели задач не отображаются (но есть в Диспетчере задач, который Ваша девочка-оператор открывать не будет). Добавлено @ 15:58 А если хотите, чтобы дочерние процессы все-таки имели окна. Обычно main.cpp выглядит так:
Переделайте так:
правда не знаю будет ли оставаться значок в панели задач пока нет окон. |
| Автор: fux 9.11.2015, 16:42 |
| Вот так сработало 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 9.11.2015, 20:25 | ||
Ну да, если с панэли задач будут исчезать произвольные окна -- то это, конечно, резко уменьшыт путаницу. Ещё раз, медленно: Вы херню делаете. Полную и абсолютную херню. Просто прекратите это делать! Создатели дажэ весьма непритязательного и корявенького виндового wm сделали всё на таком высоком уровне, который Вам в данный момент недоступен, и в ближайшые годы доступен не будет. Не пытайтесь делать за них их работу. Можэте попытаться изменить как-то своё приложэние, чтобы подстроиться под привычные стандарты, а делать наоборот -- это не ваша сильная сторона! |
| Автор: fux 10.11.2015, 08:59 |
| Чао фантик! |