2008-10-15 42 views
4

我有两个应用程序,我正在开发在Windows上使用Qt。我希望用户能够在一个应用程序中按下按钮,这使得其他应用程序成为前台。 (这些程序使用QLocalSocket和命名管道进行通信。)需要将应用程序带到Windows上的前景

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

有人能告诉我如何做到这一点,最好使用Qt虽然做不到这一点使用Win32 API就可以了。


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

+0

您可以查看这个答案:http://stackoverflow.com/a/17566801/1035613 – 2013-10-09 05:26:39

回答

4

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

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

如果,在另一方面,它简单地将消息发送到其它的应用程序,它试图SetForeground上本身,这将失败。 AllowSetForegroundWindow用于需要授予“传统”应用程序权限的情况 - 由前台应用程序执行 - 前台应用程序。再一次,AllowSet ...只有在拥有当前活动前景窗口的线程中调用时才有效。

+0

谢谢!这个建议帮助我用一个简单的Windows窗体应用程序,它需要将控制权交给另一个实例。 – 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弹出一个窗口,通过一个按钮的应用程序A.

我发现,有时部件的状态没有设置正确,所以在我的领域应用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); 
} 

我送从一个应用程序的命令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几乎总是迫使窗口到前景。之后,你并不是真的希望窗口始终保持在最前,所以重新设置为之前的标志。

相关问题