2013-04-11 2241 views
2

我有一个主窗口(QMainWindow中),并用标志的Qt :: WindowStaysOnTopHint提供辅助信息和选项(姑且称之为助手)一个小部件。如果我使用主窗口,然后单击任何其他应用程序,则此窗口不再处于活动状态(isActiveWindow()== false)。但是,如果我首先使用帮助器,然后切换到其他应用程序/窗口(而不是主窗口),它将保持活动状态。我如何处理从助手窗口切换到其他应用程序?即使QApplication :: activeWindow()也会因此而返回true。的Qt :: WindowStaysOnTopHint部件始终处于激活状态

.h文件中:

//! Popup structure that contains listw_popup that shows tips 
struct PopupWidget { 
    PopupWidget(QWidget*); 

    QWidget *base; 
    QListWidget *listw_popup; 
}; 

class MainWindow : public QMainWindow 
{ 
    ... 
private : 
    PopupWidget popup_spec; 
    ... 
} 

.cpp文件:

PopupWidget::PopupWidget(QWidget* parent) 
{ 
    base = new QWidget(parent, Qt::SplashScreen | Qt::WindowStaysOnTop); 
    listw_popup = new QListWidget(base); 
} 

MainWindow::MainWindow(QWidget *parent) : ... popup_spec(this) ... 
{ 
    ... 
} 

当popup_spec.base.show()被调用这个小部件出现。如果我点击这个小部件(意味着小部件变成活动的),即使我切换到其他应用程序,它仍然是活动的。

+0

你想要什么行为来实现? – Jay 2013-04-11 17:59:17

+0

@Jay当我从这个应用程序切换到另一个时,我需要帮助窗口消失。 – YAPPO 2013-04-12 06:00:53

+0

我无法重现您的问题。我假设帮手小部件是一个父母小部件的权利?你能显示一些最小的代码来显示你当前的行为吗? – Viv 2013-04-12 11:27:42

回答

0

好了,所以如果我正确地按照你的要求,

你想你帮手部件(其中有Qt::WindowStaysOnTopHint)当应用程序失去焦点的时候被隐藏。

你可以尝试这样的事:

在你MainWindow.cpp在构造函数中添加说:

qApp->installEventFilter(this); 

MainWindow.cpp添加事件过滤器(不要忘记在.H申报以及):

bool MainWindow::eventFilter(QObject* object, QEvent* event) { 
    if (event->type() == QEvent::ApplicationDeactivate) 
    popup_spec->base->hide(); 
    return QWidget::eventFilter(object, event); 
} 

这将切换应用程序时,隐藏的助手小部件。如果你想反向功能,以显示当应用程序被激活辅助小工具,在同一事件过滤器检查QEvent::ApplicationActivate,并呼吁popup_spec->base->show();

+0

当我偶然发现这个问题时,我试图实现这种行为。你的解决方案确实有效,但有一个问题。假设应用程序被禁用时'popup_spec'不可见。当应用程序再次激活时,它会显示,对吗?所以我发现解决这个问题的唯一方法是当我收到ApplicationDeactivate事件时,存储我的应用程序对话框的状态。 – McLeary 2016-10-14 19:27:18