Qt for HarmonyOS/user development/floating window guild zh: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
 
(3 intermediate revisions by the same user not shown)
Line 3: Line 3:
== 简介 ==
== 简介 ==


本文档详细介绍如何在 **Qt for HarmonyOS** 应用中实现 **悬浮窗(Floating Window)功能**。
本文档详细介绍如何在 Qt for HarmonyOS 应用中实现 悬浮窗(Floating Window)功能。


HarmonyOS 平台提供了原生的悬浮窗能力,Qt 通过 **QtOhosExtras** 模块,
HarmonyOS 平台提供了原生的悬浮窗能力,Qt 通过 QtOhosExtras 模块,
为开发者提供了基于 HarmonyOS 悬浮窗能力的 **Widget / QWindow 创建与管理接口**。
为开发者提供了基于 HarmonyOS 悬浮窗能力的 Widget / QWindow 创建与管理接口。


本指南将详细说明悬浮窗功能的 **使用方法、实现机制**,并提供关键代码示例。
本指南将详细说明悬浮窗功能的 使用方法、实现机制,并提供关键代码示例。


----
----
Line 69: Line 69:
</syntaxhighlight>
</syntaxhighlight>


该函数是 **Qt for HarmonyOS 提供的核心悬浮窗设置 API**,
该函数是 Qt for HarmonyOS 提供的核心悬浮窗设置 API,
用于将指定的 Qt 窗口设置为 HarmonyOS 悬浮窗模式。
用于将指定的 Qt 窗口设置为 HarmonyOS 悬浮窗模式。


Line 132: Line 132:


'''说明:'''
'''说明:'''
* 必须在 <code>show()</code> 之前调用悬浮窗设置接口
* 必须在 show() 之前调用悬浮窗设置接口
* 悬浮窗可像普通 QWidget 一样设置大小和属性
* 悬浮窗可像普通 QWidget 一样设置大小和属性
* 建议使用 <code>Qt::WA_DeleteOnClose</code> 自动释放资源
* 建议使用 Qt::WA_DeleteOnClose 自动释放资源


----
----
Line 161: Line 161:
'''说明:'''
'''说明:'''
* 悬浮窗可作为父窗口创建子窗口
* 悬浮窗可作为父窗口创建子窗口
* 支持模态(<code>exec()</code>)和非模态(<code>show()</code>)窗口
* 支持模态(exec())和非模态(show())窗口
* 子窗口遵循标准 Qt 父子关系和生命周期管理
* 子窗口遵循标准 Qt 父子关系和生命周期管理



Latest revision as of 02:55, 25 December 2025

Qt for HarmonyOS 悬浮窗功能开发指导

简介

本文档详细介绍如何在 Qt for HarmonyOS 应用中实现 悬浮窗(Floating Window)功能。

HarmonyOS 平台提供了原生的悬浮窗能力,Qt 通过 QtOhosExtras 模块, 为开发者提供了基于 HarmonyOS 悬浮窗能力的 Widget / QWindow 创建与管理接口。

本指南将详细说明悬浮窗功能的 使用方法、实现机制,并提供关键代码示例。


功能架构概述

在 HarmonyOS 中使用 Qt 悬浮窗功能时,需要理解以下架构原理。

应用窗口类型

Qt for HarmonyOS 支持多种窗口类型的创建:

  1. 标准主窗口
    • 基于 HarmonyOS 主窗口能力
    • 在应用任务栈中显示
    • 遵循标准应用生命周期
  2. 悬浮窗口
    • 基于 HarmonyOS 原生悬浮窗能力
    • 可显示在其他应用之上
    • 具有独立的显示层级

窗口层级关系

Qt 悬浮窗支持复杂的窗口层级结构:

窗口类型 父子关系支持 使用场景
主窗口 支持子窗口 应用主界面
悬浮窗 支持子窗口 悬浮工具、通知窗口
子窗口 可嵌套 对话框、弹窗

核心特性

Qt for HarmonyOS 的悬浮窗功能具有以下特点:

  1. 底层集成:基于 HarmonyOS 原生悬浮窗能力实现
  2. Qt 对象接口:支持通过标准 Qt 接口进行创建、销毁和属性设置
  3. 内容渲染:与普通 QWidget 使用相同的内容加载和绘制方式
  4. 子窗口支持:支持在悬浮窗中创建模态和非模态子窗口

Qt API 详解

setShowWindowAsFloatWindowHint()

void QtOhosExtras::setShowWindowAsFloatWindowHint(
    QWidget *widget,
    bool enable
);

该函数是 Qt for HarmonyOS 提供的核心悬浮窗设置 API, 用于将指定的 Qt 窗口设置为 HarmonyOS 悬浮窗模式。


参数说明

参数 类型 说明
widget QWidget* 需要设置为悬浮窗的窗口对象
enable bool true 表示启用悬浮窗模式,false 表示普通窗口模式

功能机制

该函数在 HarmonyOS 平台上的工作原理如下:

  1. 窗口提示设置:为指定 QWidget 设置悬浮窗显示提示
  2. 底层映射:将 Qt 窗口映射为 HarmonyOS 原生悬浮窗
  3. 属性继承:保持 Qt 窗口的所有标准属性和行为
  4. 生命周期管理:悬浮窗遵循 Qt 对象的标准生命周期

开发实现

核心实现原理

实现悬浮窗功能的关键在于:

必须在窗口调用 show()之前,调用 setShowWindowAsFloatWindowHint()


关键代码示例

1. 创建悬浮窗

// 创建悬浮窗的核心实现
void MainWindow::openFloatingWindow()
{
    // 创建窗口实例
    SecondWindow *win = new SecondWindow();

    // 关键:设置为悬浮窗模式(必须在 show() 之前)
    QtOhosExtras::setShowWindowAsFloatWindowHint(win, true);

    // 设置窗口属性
    win->setAttribute(Qt::WA_DeleteOnClose);
    win->resize(300, 300);

    // 显示窗口
    win->show();
}

说明:

  • 必须在 show() 之前调用悬浮窗设置接口
  • 悬浮窗可像普通 QWidget 一样设置大小和属性
  • 建议使用 Qt::WA_DeleteOnClose 自动释放资源

2. 在悬浮窗中创建子窗口

// 在悬浮窗中创建模态对话框
void SecondWindow::modalWithParent()
{
    SimpleDialog dlg(this); // 以悬浮窗为父窗口
    dlg.setWindowTitle("Modal with Parent");
    dlg.exec();
}

// 在悬浮窗中创建非模态子窗口
void SecondWindow::nonModalWithParent()
{
    SimpleDialog *dlg = new SimpleDialog(this);
    dlg->setWindowTitle("Non-Modal with Parent");
    dlg->setAttribute(Qt::WA_DeleteOnClose);
    dlg->show();
}

说明:

  • 悬浮窗可作为父窗口创建子窗口
  • 支持模态(exec())和非模态(show())窗口
  • 子窗口遵循标准 Qt 父子关系和生命周期管理

项目配置

# FloatWindowChilds.pro
QT += core gui widgets ohosextras
SOURCES += main.cpp

关键配置说明:

  • 必须添加
    ohosextras
    
    模块以使用悬浮窗 API

应用场景

适用场景

  • 悬浮工具:计算器、便签等小工具
  • 系统通知:消息提醒、状态显示窗口
  • 辅助功能:屏幕录制控制、音量调节等
  • 多任务协作:需要与其他应用同时显示的功能窗口

基本使用模式

void createFloatingWindow()
{
    // 1. 创建窗口实例
    YourWindow *window = new YourWindow();

    // 2. 设置为悬浮窗
    QtOhosExtras::setShowWindowAsFloatWindowHint(window, true);

    // 3. 配置窗口属性
    window->setAttribute(Qt::WA_DeleteOnClose);
    window->resize(desiredWidth, desiredHeight);

    // 4. 显示窗口
    window->show();
}

编译和测试

编译步骤

qmake FloatWindowChilds.pro && make

测试验证

  1. 启动应用:主窗口正常显示
  2. 点击 “Open OHOS floating window” 按钮
  3. 验证悬浮窗是否以悬浮模式显示,并可覆盖其他应用
  4. 在悬浮窗中创建子窗口,验证模态与非模态行为
  5. 验证悬浮窗是否支持拖拽移动

开发注意事项

悬浮窗权限

使用悬浮窗功能时,需要注意 HarmonyOS 的权限要求:

  • 悬浮窗权限:应用需申请悬浮窗显示权限
  • 系统级权限:部分场景可能需要系统级权限支持
  • 用户授权:首次使用时需用户手动授权

相关资源

  • [1] - Qt QWidget 类参考文档