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

【写在前面】

在很多应用中,很可能会需要这样的功能:

我们点击窗口上的 × (关闭),并不是要真的退出应用,而是要它们以小托盘的形式继续运行。

  • 情况 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 吧,希望它能消除更多的坑,带来更多惊喜Ծ‸ Ծ 。

相关推荐
沫璃染墨9 小时前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
小豆庄14 小时前
视频脱敏引擎的追踪难题:转场误判定、ID撞号和淡入窗口
qt·算法·目标检测·音视频·视频·敏捷流程
小灰灰搞电子16 小时前
Qt 中使用 QSettings 存储结构体数据详解
开发语言·qt
LaoWaiHang1 天前
关于Qt中鼠标左键事件被子控件截留的处理
qt
初阳7852 天前
【基于Qt5仿音乐播放器(一)】——项目准备
qt·1024程序员节
kaixin_learn_qt_ing2 天前
Qt开发工程师
qt
ShineWinsu2 天前
对于Qt:信号与槽的解析
c++·qt·gui·lambda·信号·信号与槽·槽函数
努力实干3 天前
Qt/C++ 模块化设计与工程组织
开发语言·c++·qt
Lhan.zzZ3 天前
Qt:动态库模块框架设计
开发语言·c++·qt
qq_401700414 天前
TCP 长连接、心跳包与断线自动重连设计:工业级通信的“不死鸟”架构
网络·qt·tcp/ip