Необходимо вывести приложение на передний план на Windows - PullRequest
4 голосов
/ 15 октября 2008

У меня есть два приложения, которые я разрабатываю, используя Qt для Windows. Я хочу, чтобы пользователь мог нажать кнопку в одном приложении, чтобы другое приложение вышло на передний план. (Программы взаимодействуют с использованием QLocalSocket и именованных каналов.)

В настоящее время я использую Qt QWidget :: activWindow (), которая иногда выводит приложение на передний план, но большую часть времени просто выделяет программу на панели задач.

Может кто-нибудь сказать, пожалуйста, как это сделать, желательно с использованием Qt, хотя с ошибкой, что использование WIN32 API было бы хорошо.


К сожалению, я не смог найти способ сделать это только с помощью Qt. Я решил это, используя предложение Криса Беке о вызове SetForegroundWindow из текущего активного приложения.

Ответы [ 6 ]

4 голосов
/ 15 октября 2008

Вы уверены, что это не проблема отладки? Сделка заключается в том, что если приложение имеет передний план, ему разрешено изменять передний план.

Нажатие кнопки в окне A приведет к активации переднего плана потока Windows. Если он вызывает SetForegroundWindow (или его эквивалент) в другом окне, этому окну будет присвоен передний план.

Если, с другой стороны, он просто отправляет сообщение другому приложению, которое пытается установить SetForeground на себя, это не удастся. AllowSetForegroundWindow используется в ситуациях, когда «унаследованному» приложению необходимо дать разрешение - приложению переднего плана - чтобы занять передний план. Еще раз, AllowSet ... работает только при вызове из потока, которому принадлежит текущее активное окно переднего плана.

4 голосов
/ 15 октября 2008

Помимо метода QWidget::activateWindow, вы должны вызвать QWidget::raise!

Это то, что сказано здесь .

2 голосов
/ 19 июня 2009

У меня похожий случай.

У меня есть два приложения Qt, A и B, которые общаются через сокет. Я хотел бы открыть окно приложения B через кнопку приложения A.

Я обнаружил, что иногда состояние виджета устанавливается неправильно, поэтому в функции event() виджета моего приложения B я сделал следующее:

bool MyWidgetB:event ( QEvent * e )
{
    QEvent::Type type = e->type ();

    // Somehow the correct state of window is not getting set,
    // so doing it manually
    if( e->type() == QEvent::Hide)
    {
        this->setWindowState(WindowMinimized);
    }
    else if( e->type() == QEvent::Show )
    {
        this->setWindowState((this->windowState() & ~WindowMinimized) |
                                 WindowActive);
    }
    return QWidget::event(e);
}

Я отправляю команду из приложения A в B. Получив ее, приложение B вызывает для себя следующую функцию:

void BringUpWidget(QWidget* pWidget)
{
   pWidget ->showMinimized(); // This is to bring up the window if not minimized
                              // but beneath some other window

   pWidget ->setWindowState(Qt::WindowActive);
   pWidget ->showNormal();
}

Это работает для меня, на Windows XP , с Qt 3.3. Мой MainWidget является производным от QWidget.

Я обнаружил, что это также работает с виджетом, полученным из QMainWindow, но с некоторыми проблемами. Например, если открыты какие-то другие дочерние окна.

В таком случае я сохраняю положение дочерних окон и скрываю их, затем использую функцию BringUpWidget, чтобы вызвать мой виджет MainWindow, а затем восстанавливаю дочерние окна.

1 голос
/ 28 октября 2010

Это немного глупо, но у меня работает:

            this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
            this->show();
            this->setWindowFlags(Qt::FramelessWindowHint);
            this->show();

Или, если у вас нет других флагов,

            this->setWindowFlags(Qt::WindowStaysOnTopHint);
            this->show();
            this->setWindowFlags(0);
            this->show();

WindowStaysOnTopHint почти всегда заставит окно выйти на передний план. После этого вы не хотите, чтобы окно всегда оставалось сверху, поэтому установите все предыдущие флаги.

0 голосов
/ 28 июля 2009

Используйте showNormal (), чтобы перейти из состояния иконки в видимое состояние.

0 голосов
/ 15 октября 2008

Я думаю, что вам нужны следующие API: AllowSetForegroundWindow () и SetForegroundWindow () . Я не знаю, что такое эквивалентные вызовы Qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...