Qml中的那些坑(二)---QWindow的closeEvent

【寫在前面】

在很多應用中,很可能會需要這樣的功能:

我們點擊窗口上的 × ,並不是要真的退出應用,而是要它們以小托盤的形式繼續運行。

情況 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吧,希望它能消除更多的坑,帶來更多驚喜Ծ‸ Ծ 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章