Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обнаружить потерю фокуса? Потеря фокуса приложением. 
:(
    Опции темы
fux
Дата 6.11.2015, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



Всем доброго дня!
Есть 100 приложений, каждое приложение имеет свое окно. Все их держать на экране некрасиво. Требуется скрыть окно (hide()) при потере фокуса. События типа QFocusEvent::lostFocus(), работают внутри одного процесса, при переходе с одного процесса на другой, похоже, нужны системмные события. Пршу совета.
PM MAIL   Вверх
tzirechnoy
Дата 6.11.2015, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
Пршу совета.


Прекрати страдать фигнёй.

Цитата
Требуется скрыть окно (hide()) при потере фокуса.


Что делать с окном при потере фокуса, решает пользователь (выбором настроек своего менеджэра окон).

Цитата
Все их держать на экране некрасиво.


Да-да, и это тожэ решают пользователь и программист менеджэра окон.

Цитата
Есть 100 приложений, каждое приложение имеет свое окно.


Не то, чтобы очень много -- но скорее всего всё-таки это спроектировано неправильно.
PM MAIL   Вверх
math64
Дата 9.11.2015, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Цитата(tzirechnoy @  6.11.2015,  20:43 Найти цитируемый пост)
Не то, чтобы очень много -- но скорее всего всё-таки это спроектировано неправильно. 

Я тоже так считаю. Судя по другим темаи ТС, имеется родительский процесс и куча дочерних. И каждый имеет свой GUI. Лучше GUI пусть имеет только родительский процесс, а дочерние пусть присылают ему сообщения, что нужно отобразить.
PM   Вверх
fux
Дата 9.11.2015, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



На самом деле все несколько сложней. Во первых, родительский процесс не один, они строятся каскадом. Конечно, есть один глава семейства, но он не лезет в дела своих детей. Вот вторых, дочерние процессы появляются не в процессе проектирования, а в процессе эксплуатации, и что там, в будущем будет подключаться к системе неизвестно. Вообще это задача будущего систем  управления.
PM MAIL   Вверх
math64
Дата 9.11.2015, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Если все дочерние процессы делаешь ты,  я бы сделал так:
Окно суперродителя - слева в док-виджете дерево, в центре - QMdiArea
Каждый дочерний процесс при старте посылает сообщение суперродителю и в дереве появляется новый элемент, а в QMdiArea - новый QMdiSubWindow, связанные с этим процессом.
Содержимое QMdiSubWindow создается через QUiLoader.
Последующие сообщения будут менять содержимое формы.

PM   Вверх
tzirechnoy
Дата 9.11.2015, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Если отображаемое достаточно мало -- то группировать его понесколько в одном окне, независимо от того, сколько процэссов его отображают (количество и родственные отношэния процэссов для вопрос группировки отображэния, на самом деле, вообще нерелевантны).
Если отображаемое достаточно велико -- то у тебя всё равне не уместится одновременно 100 окон на экране...
PM MAIL   Вверх
fux
Дата 9.11.2015, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



Все именно так и обстоит, вопрос не в том. За пультом монитора будет сидеть девочка оператор, которая не обязана следить за расположением и закрытием окон. Поэтому панель задач будет забита ярлыками, которые кроме путаницы ничего не дают. Если оператор не пользуется окном оно просто должно исчезнуть.
PM MAIL   Вверх
math64
Дата 9.11.2015, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Свернуть и спрятать MDI-окно будет просто, а открыть его можно через дерево. А процессы, у которых нет своего окна, вроде как на панели задач не отображаются (но есть в Диспетчере задач, который Ваша девочка-оператор открывать не будет).

Добавлено @ 15:58
А если хотите, чтобы дочерние процессы все-таки имели окна.
Обычно main.cpp выглядит так:
Код

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();    
    return a.exec();
}


Переделайте так:
Код

int main(int argc, char *argv[])
{
    int ret;
    for(;;) {
      QApplication a(argc, argv);
      MainWindow w;
      w.show();    
      ret = a.exec();
      <программа работает без окон>
      if (<проверка на завершение>)
         break;
    }
    return ret;
}

правда не знаю будет ли оставаться значок в панели задач пока нет окон.


Это сообщение отредактировал(а) math64 - 9.11.2015, 16:03
PM   Вверх
fux
Дата 9.11.2015, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}

PM MAIL   Вверх
tzirechnoy
Дата 9.11.2015, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
будет забита ярлыками, которые кроме путаницы ничего не дают. Если оператор не пользуется окном оно просто должно исчезнуть.


Ну да, если с панэли задач будут исчезать произвольные окна -- то это, конечно, резко уменьшыт путаницу.

Ещё раз, медленно: Вы херню делаете. Полную и абсолютную херню. Просто прекратите это делать!

Создатели дажэ весьма непритязательного и корявенького виндового wm сделали всё на таком высоком уровне, который Вам в данный момент недоступен, и в ближайшые годы доступен не будет. Не пытайтесь делать за них их работу. Можэте попытаться изменить как-то своё приложэние, чтобы подстроиться под привычные стандарты, а делать наоборот -- это не ваша сильная сторона!
PM MAIL   Вверх
fux
Дата 10.11.2015, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



Чао фантик!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.