У меня есть два приложения, которые я разрабатываю с использованием Qt для Windows. Я хочу, чтобы пользователь мог нажимать кнопку в одном приложении, что заставляет другое приложение выходить на передний план. (Программы взаимодействуют с помощью QLocalSocket и именованных каналов.)
В настоящее время я использую QWidget :: activateWindow (), который иногда выводит приложение на передний план, но в большинстве случаев он просто выделяет программу на панели задач.
Может ли кто-нибудь сказать мне, как это сделать, желательно с использованием Qt, хотя в противном случае использование WIN32 API было бы нормально.
К сожалению, я не смог найти способ сделать это только с Qt. Я решил это, используя предложение Криса Беке вызвать SetForegroundWindow из текущего активного приложения.





В дополнение к методу QWidget::activateWindow вы должны вызвать QWidget::raise!
Об этом говорит здесь.
Ваша ссылка ведет к локальному файлу, вам следует использовать URL-адрес doc.trolltech.com/4.4/qwidget.html#activateWindow.
Я думаю, что вам нужны API AllowSetForegroundWindow () и SetForegroundWindow (). Я не знаю, каковы эквивалентные вызовы Qt.
Вы уверены, что это не проблема отладки? Дело в том, что если приложение ИМЕЕТ передний план, ему разрешено изменить передний план.
Нажатие кнопки в окне A активирует этот поток окон переднего плана. Если он вызывает SetForegroundWindow (или эквивалент) в другом окне, это окно БУДЕТ отдано на передний план.
Если, с другой стороны, он просто отправляет сообщение другому приложению, которое пытается установить SetForeground на самом себе, это не удастся. AllowSetForegroundWindow используется в ситуациях, когда «унаследованному» приложению должно быть предоставлено разрешение - от приложения переднего плана - для перехода на передний план. Еще раз, AllowSet ... работает, только если вызывается из потока, которому принадлежит текущее активное окно переднего плана.
Спасибо! Этот совет помог мне с простым приложением Windows Forms, которому нужно было передать управление другому экземпляру.
У меня похожий случай.
У меня есть два приложения 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, а затем восстанавливаю дочерние окна.
Используйте showNormal (), чтобы перейти из состояния в виде значков в видимое состояние.
Это немного глупо, но для меня это работает:
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 почти всегда переводит окно на передний план. После этого вы действительно не хотите, чтобы окно всегда оставалось наверху, поэтому установите все предыдущие флаги.
Вы можете просмотреть этот ответ: stackoverflow.com/a/17566801/1035613