2008-10-15 5 views
4

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

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

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

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

+0

Вы можете просмотреть этот ответ: http://stackoverflow.com/a/17566801/1035613 – 2013-10-09 05:26:39

ответ

4

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

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

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

+0

Thankyou! Этот совет помог мне с простым приложением Windows Forms, которое должно было передать управление другому экземпляру. – andypaxo 2010-09-28 17:30:03

4

В верхней части метода QWidget::activateWindow вы должны позвонить QWidget::raise!

Это то, что сказано here.

+0

Ваша ссылка на местный файл, URL, который вы должны использовать, - http://doc.trolltech.com/4.4/qwidget .html # activateWindow – 2008-10-15 19:58:45

2

У меня такой же случай.

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

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

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, а затем восстановить дочерние окна.

0

Используйте showNormal() для перехода из отображаемого состояния в видимое состояние.

1

Это своего рода дрянной, но это работает для меня:

  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 почти всегда будет заставить окно к на переднем плане. Впоследствии вы не хотите, чтобы окно всегда оставалось на вершине, поэтому сбросьте все предыдущие флаги.

Смежные вопросы