2013-04-11 306 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

相關問題