m_pLoginDlg->hide(); m_pLoginDlg->activateWindow(); //m_pLoginDlg->raise(); m_pLoginDlg->show();
我們知道,在windows上通過鼠標雙擊某應用程序圖標,該應用程序往往會以頂層窗口的形式呈現在我們面前,但是對於一個已經打開的非頂層窗口,我們怎么將其激活為頂層窗口呢?
要達到激活,這個必須要滿足兩個條件,第一,必須要有通知激活的人,這個人必須是另一個應用程序(或同一應用程序的不同示例),他能發送信息給該窗體;第二,該窗體能夠解析出該消息。至於一個應用程序如何向另一個應用程序發送消息的方法有很多,如共享內存,網絡的方式等等。這里就不做詳述,好,閑話少說,我們進入正題,有了前面的兩個條件,假設現在該窗體所在的應用程序解析到了另一個應用程序的通知激活消息,那麽該窗體怎么將其激活為桌面的頂層窗體呢?
void CWidget::activateWindow() { Qt::WindowStates winStatus = Qt::WindowNoState; if (windowState() & Qt::WindowMaximized) { winStatus = Qt::WindowMaximized; } setWindowState(Qt::WindowMinimized); setWindowState(Qt::WindowActive | winStatus); setGeometry(curGemRect); activateWindow(); raise(); }
通過在窗體處理函數中調用上述函數,就可以將該窗體設為頂層窗體,其中,CWidget派生自QWidget(當然其他窗體也行,只要窗體的最終父類是QWidget就行),curGemRect是CWidget的成員變量,用來保存窗體的幾何位置,這樣就能記住窗體上一次彈出的位置,不過還要重載兩個函數,resizeEvent和moveEvent,以保證窗體大小和位置改變后能時刻記住其位置。
voidCWidget::resizeEvent(QResizeEvent*event) { curGemRect = geometry(); } void CWidget::moveEvent(QMoveEvent *event) { curGemRect = geometry(); }
