QT 視窗最小化後隱藏
阿新 • • 發佈:2019-01-08
通常最小化的視窗會在工作列上顯示一個按鈕。當用戶按一下這個按鈕,視窗就還原了。這是一個被大多數桌面環境,比如Windows,KDE,GNOME所採用的普遍設計。不過,因為工作列通常只是桌面邊上一小行,容納不了很多按鈕,使用者通常希望把那些不常用的程式隱藏起來,只在通知欄顯示一個小圖示,要使用的時候再點選那個小圖示恢復視窗。這種作法最典型的例子是QQ和Winamp。
原本以為這個功能是很容易的,今天試著做了一下,原來還有些小麻煩。最基本的思路是攔截視窗的最小化事件,通過閱讀Qt文件,可以這麼做:
把這個程式碼拿去試一下,發現不行,工作列的按鈕仍然還在,點選還原後窗口一片空白。仔細想一下,估計是因為這個changeEvent()是在Qt處理最小化事件前呼叫的。我們把視窗隱藏了,但是Qt還以為視窗正要最小化。仍然執行一遍處理最小化視窗的程式碼。所以出錯了。
解決的思路是先讓Qt處理完視窗最小化,等處理完之後再隱藏視窗。這樣的話,把hide()那一行改寫成:
QTimer::singleShot(0, this, SLOT(hide()));
這個是singleShot()的特殊用法,如果第一個引數,也就是等待時間為0,當Qt回到訊息迴圈的時候,通常就是當前處理的事件處理完之後就立即執行this->hide();
點選通知欄圖示的處理程式碼需要多一下setWindowState():
