【寫在前面】
在很多應用中,很可能會需要這樣的功能:
我們點擊窗口上的 × ,並不是要真的退出應用,而是要它們以小托盤的形式繼續運行。
情況 1:如果 × 是自定義的按鈕,我們可以輕易控制它的行爲,hide -> system tray。
情況 2:如果 × 是窗口自帶的按鈕,那麼對於 QWidgets 來說,我們只需要重寫其 closeEvent 方法,然後實現想要的動作。然鵝,對於 Qml 的 Window ( 即 QQuickWindow ),會發現一些問題。
【正文開始】
首先,有一個很尷尬的事實:QWindow 並沒有 closeEvent。
因此,這直接導致其子類 QQuickWindow 也沒有 closeEvent。
不過,一個好消息是:
在 Qt 6 中將會加入此事件處理方法。
然鵝,目前來說,能使用的只有兩個方法:
-
連接 QQuickWindow 的 closing() 信號,這個方法有個巨大的坑:無法在c++中使用,因爲,其參數類型 QQuickCloseEvent 是不完整的,即:沒有提供c++的外部訪問接口。
但是,卻提供了 Qml 中的訪問接口,方法如下:
Window {
onClosing: {
//do something
close.accepted = false;
}
}
然後將 close 事件的 accepted 設爲不接受,即可完成我們自己的動作。
- 另一個方法則是重新實現 event() 函數:
bool ImageWindow::event(QEvent *ev)
{
if (ev->type() == QEvent::Close) {
ev->setAccepted(false);
}
return QQuickWindow::event(ev);
}
然後處理其 QEvent::Close 事件也可以達到想要的效果。
【結語】
最後,還是期待下Qt 6吧,希望它能消除更多的坑,帶來更多驚喜Ծ‸ Ծ 。