4

我有两个在 Windows 上使用 Qt 开发的应用程序。我希望用户能够在一个应用程序中按下一个按钮,从而使另一个应用程序进入前台。(程序使用 QLocalSocket 和命名管道进行通信。)

目前我正在使用 Qt 的 QWidget::activateWindow() 偶尔将应用程序带到前台,但大多数时候它只是突出显示任务栏上的程序。

有人可以告诉我如何做到这一点,最好使用 Qt,尽管如果不使用 WIN32 API 就可以了。


不幸的是,我无法找到仅使用 Qt 的方法。我使用 Chris Becke 从当前活动的应用程序调用 SetForegroundWindow 的建议解决了这个问题。

4

6 回答 6

4

QWidget::activateWindow方法之上,你应该调用QWidget::raise!

这就是这里所说的。

于 2008-10-15T10:09:39.063 回答
4

你确定这不是调试问题吗?交易是,如果应用程序具有前台,则允许更改前台。

单击窗口 A 上的按钮将激活该窗口线程前台。如果它在另一个窗口上调用 SetForegroundWindow(或等效项),则该窗口将被赋予前景。

另一方面,如果它只是向其他应用程序发送一条消息,该应用程序尝试自行设置前景,那将失败。AllowSetForegroundWindow 用于“旧版”应用程序需要获得权限(由前台应用程序)以占据前台的情况。再一次,AllowSet... 仅在从拥有当前活动前台窗口的线程调用时才有效。

于 2008-10-15T13:09:17.593 回答
2

我有一个类似的案例。

我有两个 Qt 应用程序 A 和 B,它们在套接字上进行通信。我想通过应用程序 A 上的按钮打开应用程序 B 的窗口。

我发现有时小部件状态设置不正确,因此在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的 is 是从一个QWidget.

我发现这也适用于派生自 的小部件QMainWindow,但存在一些问题。就像其他一些子窗口打开一样。

对于这种情况,我存储子窗口的位置并隐藏它们,然后使用该BringUpWidget功能带上我的MainWindow小部件,然后恢复子窗口。

于 2009-06-19T12:21:02.787 回答
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 几乎总是将窗口强制到前台。之后,您并不真的希望窗口始终保持在顶部,因此请重置为之前的标志。

于 2010-10-27T22:02:45.300 回答
0

我认为您需要的 API 是AllowSetForegroundWindow()SetForegroundWindow()。我不知道等效的 Qt 调用是什么。

于 2008-10-15T10:56:05.660 回答
0

使用 showNormal() 从图标化状态变为可见状态。

于 2009-07-28T15:28:28.583 回答