【写在前面】
在很多应用中,很可能会需要这样的功能:
我们点击窗口上的 × (关闭),并不是要真的退出应用,而是要它们以小托盘的形式继续运行。
-
情况 1:如果 × 是自定义的按钮,我们可以轻易控制它的行为,hide -> system tray。
-
情况 2:如果 × 是窗口自带的按钮,那么对于
QWidgets
来说,我们只需要重写其closeEvent
方法,然后实现想要的动作。然鹅,对于 Qml 的Window
( 即QQuickWindow
),会发现一些问题。
【正文开始】
首先,有一个很尴尬的事实:QWindow
并没有 closeEvent
。
因此,这直接导致其子类 QQuickWindow
也没有 closeEvent
。
不过,一个好消息是:
在 Qt 6 中将会加入此事件处理方法 (Qt6已有)。
然鹅,目前来说,能使用的只有两个方法:
- 连接
QQuickWindow
的closing()
信号,这个方法有个巨大的坑:无法在 c++ 中使用,因为,其参数类型QQuickCloseEvent
是不完整的,即:没有提供c++的外部访问接口。
但是,却提供了 Qml 中的访问接口,方法如下:
javascript
Window {
onClosing: {
//do something
close.accepted = false;
}
}
然后将 close 事件的 accepted
设为不接受,即可完成我们自己的动作。
- 另一个方法则是重新实现
event()
函数:
c++
bool ImageWindow::event(QEvent *ev)
{
if (ev->type() == QEvent::Close) {
ev->setAccepted(false);
}
return QQuickWindow::event(ev);
}
然后处理其 QEvent::Close
事件也可以达到想要的效果。
【结语】
最后,还是期待下 Qt 6 吧,希望它能消除更多的坑,带来更多惊喜Ծ‸ Ծ 。