Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Как обнаружить потерю фокуса?


Автор: fux 6.11.2015, 14:31
Всем доброго дня!
Есть 100 приложений, каждое приложение имеет свое окно. Все их держать на экране некрасиво. Требуется скрыть окно (hide()) при потере фокуса. События типа QFocusEvent::lostFocus(), работают внутри одного процесса, при переходе с одного процесса на другой, похоже, нужны системмные события. Пршу совета.

Автор: tzirechnoy 6.11.2015, 20:43
Цитата
Пршу совета.


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

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


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

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


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

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


Не то, чтобы очень много -- но скорее всего всё-таки это спроектировано неправильно.

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

Я тоже так считаю. Судя по другим темаи ТС, имеется родительский процесс и куча дочерних. И каждый имеет свой GUI. Лучше GUI пусть имеет только родительский процесс, а дочерние пусть присылают ему сообщения, что нужно отобразить.

Автор: 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 выглядит так:
Код

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;
}

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

Автор: 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
Чао фантик!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)