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

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

有人可以告诉我如何做到这一点,最好使用Qt虽然没有使用WIN32 API会没问题。


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

有帮助吗?

解决方案

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

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

另一方面,如果它只是向另一个试图向其自身尝试SetForeground的应用程序发送消息,那么它将失败。 AllowSetForegroundWindow用于需要为“遗留”应用程序授予前景应用程序权限以获取前景的情况。再一次,AllowSet ...仅在从拥有当前活动前景窗口的线程调用时才有效。

其他提示

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

这就是此处

我有类似的情况。

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

我发现有时窗口小部件状态设置不正确,因此在我的应用程序B的窗口小部件的 event()函数中,我执行了以下操作:

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 小部件,然后恢复子窗口

这有点俗气,但对我有用:

            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几乎总是将窗口强制到前台。之后,你真的不希望窗口总是保持在最顶层,所以重置为以前的标志。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top