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

相关推荐
用户8334423966146 小时前
从批量操作到任务中心,再到现场工作台:DeviceForge v2.10—v2.12 完整演进
qt
宛 禾7 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习
打工仔折腾 AI12 小时前
Qt网络编程实战:UDP、TCP到HTTP的落地经验与选型
网络·人工智能·后端·python·qt·udp·ai agent 实战
Lhan.zzZ12 小时前
Linux + Qt/QML:解决 QtQuick.VirtualKeyboard.Plugins 模块加载失败与环境变量配置
linux·数据库·qt
誰能久伴不乏14 小时前
QT工业上位机一次「指令静默丢失」的排查
qt·docker·github
扶尔魔ocy1 天前
【qt openGL入门笔记】OSG实现飞机模型在网格图上飞行并进行态势标绘(四)
qt·opengl·osg
橙橙笔记1 天前
QT安卓软件的制作
android·git·qt·软件
芦芭荞1 天前
QT使用xml模版生成word文档
xml·qt·word
mengzhi啊1 天前
qt把结构体数据存入json文件
qt·json
kaixin_learn_qt_ing2 天前
写入二进制文件(Qt)
qt