2013-05-06 400 views
1

我的應用程序有非矩形的彈出窗口小部件。檢測QWidget外部點擊

其類定義了以下以實現透明度:

setAttribute(Qt::WA_NoSystemBackground, true); 
setAttribute(Qt::WA_TranslucentBackground, true); 

我也使用:

this->setWindowFlags(Qt::Popup| Qt::FramelessWindowHint); 

的問題是,在Windows 7,一種自動的「影子」被上所繪製的我的窗戶的底部和右側。這是非常不可取的。

所以,我嘗試使用Qt ::工具,而不是Qt的::彈出

this->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); 

此作品在視覺上。沒有陰影,但現在我的窗口小部件窗口外面點擊鼠標不會自動關閉/隱藏它,因爲它會用Qt :: Popup完成。

所以,我需要這兩個解決方案之一:

  1. 有Qt的::彈出一種方法擺脫Windows自動陰影裝飾
  2. 辦法讓Qt的::工具窗口在其外部發生鼠標點擊。

一注:我的應用程序是爲Windows XP及以上構建的。我不能僅使用Vista/Win7運行時DLL,也不能使用「Windows XP」和「Vista和更高版本」單獨的版本。

任何建議將受到歡迎。

回答

1

意識到,沒有「SetFocusPolicy」通話量將允許我收到一個Qt :: Tool窗口的事件之後。最後,我已經使出別的東西來解決我的問題:

  1. 我不停作爲Qt :: Popup的Qt:工具導致了不希望的陰影效果,使我的所有者繪製框架變暗。去掉這種風格不能在Qt中完成,我不想混淆特定於平臺的條件代碼。
  2. 我使用Qt :: tool窗口安裝了一個事件過濾器,並開始接收事件,這些事件幫助我瞭解何時單擊了應用程序的其他部分,或者應用程序本身是否失去了焦點到另一個應用程序。這就是我需要的,功能明智的。當用戶點擊應用程序主窗口的非客戶區域時,例如窗口標題,我也可以得到一個事件,以便在拖動開始時關閉它。
+0

Qt :: WindowType :: NoDropShadowWindowHint可以擦除陰影效果 – Enzojz 2016-12-19 09:44:55

1

您可以手動觀察焦點是否從您的Qt::Tool窗口改變。所以基本上你會注意什麼時候焦點會放到你的流程的另一個窗口上,或者當你的應用程序失去焦點時。

How to detect that my application lost focus in Qt?

希望有所幫助。

+0

Qt:如果我點擊其父部件的框架,工具不會收到focusOutEvent。只有Qt :: Popup可以做到這一點。 – JasonGenX 2013-05-08 15:39:37

+1

你必須爲它設置焦點策略來接收焦點事件:'this-> setFocusPolicy(Qt :: ClickFocus);' – phyatt 2013-05-08 16:53:35

1

我對Windows 7的解決方案:

QDialog *d = new QDialog; 
d->setStyleSheet("background:transparent;"); 
d->setAttribute(Qt::WA_DeleteOnClose, true); 
d->setAttribute(Qt::WA_TranslucentBackground, true); 
#ifdef Q_OS_WIN 
d->createWinId(); 
#endif 
d->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint); 
d->show(); 
0

設置我而QListView

d->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint); 

安裝eventfilter和使用MousePressEvent隱藏而QListView部件。

列表上的MousePressEvent從來沒有過濾它們產生的其他事件,我沒有調試。

所以,如果你想設計自動完成這將是完美的。在Qt5.3.1中測試。