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

相关推荐
sycmancia10 小时前
Qml——Image和AnimatedImage使用
qt
lhbweilai13 小时前
QT(了解各个控件和布局)上
数据库·qt
ShineWinsu19 小时前
对于Qt:QLabel常见属性的解析
c++·qt·面试·笔试·gui·标签·qlabel
小徐不徐说19 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
蓝祁子yoky1 天前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
飞浪纪元[FWC–FE]2 天前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt
ShineWinsu2 天前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
ShineWinsu2 天前
对于Qt:QPushButton常见属性的解析
开发语言·c++·qt·api·gui·按钮·qpushbutton
飞浪纪元[FWC–FE]2 天前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt
Lhan.zzZ2 天前
用 Qt 构建线程安全的通讯静态库:从线程亲和性到完整工程
c++·vscode·qt·tcp/ip·udp