У меня похожий случай.
У меня есть два приложения 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
, а затем восстанавливаю дочерние окна.