HarmonyOS鸿蒙PC开源QT软件移植:基于 Qt Widgets 的网络调试助手工具

随着OpenHarmony生态向PC端扩展,网络调试工具成为开发者日常工作中不可或缺的工具。NetTool作为一款基于Qt Widgets的开源网络调试助手,支持TCP客户端、TCP服务器、UDP服务器等多种网络通信功能,非常适合移植到HarmonyOS PC平台。本文将详细介绍如何将NetTool移植到HarmonyOS PC环境,为开发者提供一个功能完善的网络调试工具。

注意:本文使用的Qt for OpenHarmony SDK由OpenHarmony SIG社区基于Qt 5.15独立开发和维护,非Qt官方版本。

NetTool在HarmonyOS PC端的优势

NetTool作为一款成熟的网络调试工具,其丰富的网络通信功能和直观的用户界面非常适合移植到HarmonyOS PC平台。

通过移植,NetTool将能够:

  1. 充分利用Qt Widgets:NetTool基于Qt Widgets模块,可以无缝适应HarmonyOS PC的桌面环境。
  2. 多种网络协议支持:支持TCP客户端、TCP服务器、UDP服务器等多种网络通信模式。
  3. 数据格式灵活:支持多种数据格式的发送和接收,满足不同调试需求。
  4. 跨平台一致性:保持与原版NetTool一致的用户界面和功能,减少学习成本。

通过移植,相信大家也能够理解如何基于Qt的Qt Widgets开发鸿蒙PC上的应用了。至于界面和布局的开发,当然还是用qtcreator这个工具可视化编辑*.ui界面文件了。

移植成功的项目源码开源地址https://gitcode.com/qq8864/nettool-hmos

环境搭建与配置

文档适用范围

  • HarmonyOS API 12 及以上版本
  • Qt for OpenHarmony (基于 Qt 5.15)
  • DevEco Studio 5.0 及以上版本

前置条件

  1. 安装DevEco Studio 5.0及以上版本
  2. 下载并配置Qt for OpenHarmony SDK
  3. 了解HarmonyOS应用开发基础

1. DevEco Studio下载与安装

  • 官方下载地址DevEco Studio官网
  • 注意事项
    • 推荐使用最新稳定版本以获得最佳兼容性。
    • 历史版本可能不支持最新的HarmonyOS API,可通过官网指定页面获取。
    • 具体安装步骤请参考鸿蒙官方安装教程

2. Qt SDK下载与配置

2.1 获取Qt for OpenHarmony SDK

从发布页面下载适用于你开发平台(Windows或Mac)的SDK压缩包。

2.2 安装与验证Qt for OpenHarmony SDK

Mac平台示例:

  1. 打开终端,创建目录并解压SDK。

    bash 复制代码
    mkdir ~/QtForOpenHarmony
    cd ~/Downloads
    tar -xf Qt5.15.12_alpha_v7_arm64-v8a_openharmony_ndk_5.0.3.135_community_macos.tar.gz -C ~/QtForOpenHarmony
  2. 验证安装。

    bash 复制代码
    cd ~/QtForOpenHarmony/bin
    ./qmake -query

    如果输出中包含 QMAKE_XSPEC:oh-clang,则表明Qt for OpenHarmony SDK安装成功。

Windows平台注意:

  • 使用解压工具(如7-Zip)将SDK压缩包解压到指定目录,例如 C:\QtForOpenHarmony
  • 后续在DevEco Studio配置中,使用对应的Windows路径。

如未完成,请参考前文《QT开发鸿蒙移动应用:环境搭建及第一个HelloWorld程序》中的环境搭建部分。

下载与准备NetTool源码

  1. 下载NetTool源码源码地址

  2. 解压源码 :将下载的源码包解压到一个工作目录,例如 ~/Projects/nettool-hmos

    源码可直接放置到 entry/src/main/cpp目录。

创建HarmonyOS工程

1. 新建HarmonyOS工程

  1. 打开DevEco Studio,选择"Create Project"。
  2. 选择"Native C++"模板。
  3. 配置工程信息:
    • Project Name : NetTool
    • Bundle Name : com.example.nettool
    • Save Location : 工程保存路径(如 ~/Projects/nettool-hmos
    • Compile SDK: 选择API 12或更高版本
    • Model: 选择"Stage"
  • Device Type: 选择"Tablet"或"2in1"

2. 修改为OpenHarmony工程

修改工程级 build-profile.json5 文件:

json 复制代码
"products": [
  {
    "name": "default",
    "signingConfig": "default",
    "compileSdkVersion": 17,
    "targetSdkVersion": 17,
    "compatibleSdkVersion": 17,
  
    // ... 其他配置
  }
]

点击"Sync Now"同步工程。

3. 工程配置调整

3.1 修改Native编译配置

在模块级build-profile.json5中配置Qt SDK路径和架构:

json 复制代码
"externalNativeOptions": {
  "path": "./src/main/cpp/CMakeLists.txt",
  "arguments": "-DQT_PREFIX=/path/to/your/QtForOpenHarmony",
  "abiFilters": ["arm64-v8a"] // PC设备通常使用64位ARM或x86架构
}

注意:根据实际PC设备架构调整abiFilters,可能为["arm64-v8a"]["x86_64"]

3.2 拷贝依赖文件
  1. 拷贝ets文件 :将Qt SDK下的openharmony/qtbase目录内容复制到src/main/ets目录(直接覆盖)。
  2. 拷贝库文件 :将Qt SDK下的plugins/platforms/libplugins_platforms_qopenharmony.so拷贝到libs/arm64-v8a目录下。
3.3 配置UIAbility

module.json5中配置PC应用入口:

json 复制代码
{
  "module": {
    "name": "entry",
    "type": "entry",
    "srcEntry":"./ets/abilitystage/MyAbilityStage.ets" ,// 关键配置
    // ...
    "abilities": [
      {
        "name": "EntryAbility",
        "launchType": "specified", // 关键配置
        // ... 其他配置
      }
    ]
  }
}

项目结构解析

NetTool项目采用模块化设计,主要目录结构如下:

复制代码
nettool-hmos/
├── entry/
│   ├── src/main/
│   │   ├── cpp/              # C++ 源代码
│   │   │   ├── api/          # 核心 API 模块
│   │   │   │   ├── app.cpp/.h          # 应用配置管理
│   │   │   │   ├── quiwidget.cpp/.h    # UI 辅助类
│   │   │   │   └── tcpserver.cpp/.h     # TCP 服务器实现
│   │   │   ├── file/         # 资源文件
│   │   │   │   ├── device.txt    # 设备配置
│   │   │   │   └── send.txt      # 发送数据配置
│   │   │   ├── form/         # 界面模块
│   │   │   │   ├── frmmain.cpp/.h/.ui       # 主窗口
│   │   │   │   ├── frmtcpclient.cpp/.h/.ui   # TCP 客户端
│   │   │   │   ├── frmtcpserver.cpp/.h/.ui   # TCP 服务器
│   │   │   │   └── frmudpserver.cpp/.h/.ui   # UDP 服务器
│   │   │   ├── other/        # 其他资源
│   │   │   │   ├── main.ico         # 应用图标
│   │   │   │   ├── main.qrc         # 资源文件
│   │   │   │   └── qt_zh_CN.qm      # 中文翻译
│   │   │   ├── snap/         # 截图资源
│   │   │   ├── CMakeLists.txt       # CMake 构建配置
│   │   │   ├── main.cpp             # 应用入口
│   │   │   └── nettool.pro          # Qt 项目文件
│   │   ├── ets/              # ArkTS 代码
│   │   │   ├── entryability/ # 应用生命周期管理
│   │   │   └── pages/        # Index 页面
│   │   └── module.json5      # 模块配置
│   └── libs/                 # 依赖库
└── README.md                 # 项目说明

关键代码实现

1. 入口函数配置

使用标准Qt应用入口main()函数,确保应用正确初始化:

cpp 复制代码
// main.cpp
#include <QApplication>
#include <QSurfaceFormat>
#include <QTranslator>
#include "form/frmmain.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 配置OpenGL ES表面格式
    QSurfaceFormat format;
    format.setAlphaBufferSize(8);
    format.setBlueBufferSize(8);
    format.setGreenBufferSize(8);
    format.setRedBufferSize(8);
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    format.setRenderableType(QSurfaceFormat::OpenGLES);
    format.setVersion(3, 0);
    QSurfaceFormat::setDefaultFormat(format);
    
    // 设置应用信息
    a.setApplicationName("NetTool");
    a.setOrganizationName("HarmonyOS Developer");
    
    // 加载中文翻译
    QTranslator translator;
    if (translator.load(":/other/qt_zh_CN.qm")) {
        a.installTranslator(&translator);
    }
    
    // 显示主窗口
    frmMain w;
    w.show();
    
    return a.exec();
}

2. CMakeLists.txt配置

创建CMakeLists.txt文件,配置项目构建选项:

cmake 复制代码
cmake_minimum_required(VERSION 3.16)
project(nettool VERSION 1.0.0)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#设置qt SDK路径
list(APPEND CMAKE_FIND_ROOT_PATH ${QT_PREFIX})

find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS 
    Core 
    Gui 
    Widgets 
    Network 
    Concurrent
)

# 添加源文件
file(GLOB UI_SRC 
    ${PROJECT_SOURCE_DIR}/form/*.ui
)

aux_source_directory(${PROJECT_SOURCE_DIR}/api API_SRC)
aux_source_directory(${PROJECT_SOURCE_DIR}/form FORM_SRC)

# 创建共享库(HarmonyOS要求)
add_library(${PROJECT_NAME} SHARED 
    ${API_SRC}
    ${FORM_SRC}
    ${UI_SRC}
    ${PROJECT_SOURCE_DIR}/main.cpp
    ${PROJECT_SOURCE_DIR}/other/main.qrc
)

# 包含目录
target_include_directories(${PROJECT_NAME} PRIVATE
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_SOURCE_DIR}/api
    ${PROJECT_SOURCE_DIR}/form
)

# 链接库
target_link_libraries(${PROJECT_NAME} PRIVATE
    Qt${QT_VERSION_MAJOR}::Core
    Qt${QT_VERSION_MAJOR}::Gui
    Qt${QT_VERSION_MAJOR}::Widgets
    Qt${QT_VERSION_MAJOR}::Network
    Qt${QT_VERSION_MAJOR}::Concurrent
    # 链接鸿蒙平台插件
    ${QT_PREFIX}/plugins/platforms/libplugins_platforms_qopenharmony.so
)

3. 主窗口实现

主窗口frmmain.cpp负责整合各个功能模块:

cpp 复制代码
// frmmain.cpp
#include "frmmain.h"
#include "ui_frmmain.h"
#include "frmtcpclient.h"
#include "frmtcpserver.h"
#include "frmudpserver.h"

frmMain::frmMain(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::frmMain)
{
    ui->setupUi(this);
    
    // 设置窗口属性
    setWindowTitle("NetTool - HarmonyOS网络调试助手");
    resize(1024, 768);
    
    // 初始化标签页
    initTabs();
    
    // 连接信号槽
    connect(ui->actionExit, &QAction::triggered, this, &frmMain::close);
    connect(ui->actionAbout, &QAction::triggered, this, &frmMain::showAbout);
    
    // 设置状态栏
    statusBar()->showMessage("就绪 - HarmonyOS网络调试助手");
}

frmMain::~frmMain()
{
    delete ui;
}

void frmMain::initTabs()
{
    // TCP客户端
    frmTcpClient *tcpClient = new frmTcpClient(this);
    ui->tabWidget->addTab(tcpClient, "TCP客户端");
    
    // TCP服务器
    frmTcpServer *tcpServer = new frmTcpServer(this);
    ui->tabWidget->addTab(tcpServer, "TCP服务器");
    
    // UDP服务器
    frmUdpServer *udpServer = new frmUdpServer(this);
    ui->tabWidget->addTab(udpServer, "UDP服务器");
}

void frmMain::showAbout()
{
    QMessageBox::about(this, "关于NetTool",
        "<h3>NetTool - HarmonyOS网络调试助手</h3>"
        "<p>版本: 1.0.0</p>"
        "<p>基于Qt Widgets移植到HarmonyOS PC平台</p>"
        "<p>支持TCP客户端、TCP服务器、UDP服务器等功能</p>"
        "<p>© 2024 HarmonyOS开发者社区</p>");
}

4. TCP客户端实现

TCP客户端模块frmtcpclient.cpp实现网络连接功能:

cpp 复制代码
// frmtcpclient.cpp
#include "frmtcpclient.h"
#include "ui_frmtcpclient.h"
#include <QTcpSocket>
#include <QMessageBox>

frmTcpClient::frmTcpClient(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::frmTcpClient),
    tcpSocket(new QTcpSocket(this))
{
    ui->setupUi(this);
    
    // 连接信号槽
    connect(ui->btnConnect, &QPushButton::clicked, this, &frmTcpClient::onConnect);
    connect(ui->btnDisconnect, &QPushButton::clicked, this, &frmTcpClient::onDisconnect);
    connect(ui->btnSend, &QPushButton::clicked, this, &frmTcpClient::onSend);
    connect(tcpSocket, &QTcpSocket::connected, this, &frmTcpClient::onConnected);
    connect(tcpSocket, &QTcpSocket::disconnected, this, &frmTcpClient::onDisconnected);
    connect(tcpSocket, &QTcpSocket::readyRead, this, &frmTcpClient::onReadyRead);
    connect(tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::error),
            this, &frmTcpClient::onError);
}

frmTcpClient::~frmTcpClient()
{
    delete ui;
}

void frmTcpClient::onConnect()
{
    QString ip = ui->txtIP->text();
    int port = ui->txtPort->text().toInt();
    
    tcpSocket->connectToHost(ip, port);
}

void frmTcpClient::onDisconnect()
{
    tcpSocket->disconnectFromHost();
}

void frmTcpClient::onSend()
{
    if (!tcpSocket->isOpen()) {
        QMessageBox::warning(this, "警告", "请先连接到服务器");
        return;
    }
    
    QString data = ui->txtSend->toPlainText();
    if (data.isEmpty()) {
        return;
    }
    
    tcpSocket->write(data.toUtf8());
    ui->txtReceive->append("发送: " + data);
}

void frmTcpClient::onConnected()
{
    ui->txtReceive->append("已连接到服务器");
    ui->btnConnect->setEnabled(false);
    ui->btnDisconnect->setEnabled(true);
}

void frmTcpClient::onDisconnected()
{
    ui->txtReceive->append("已断开连接");
    ui->btnConnect->setEnabled(true);
    ui->btnDisconnect->setEnabled(false);
}

void frmTcpClient::onReadyRead()
{
    QByteArray data = tcpSocket->readAll();
    ui->txtReceive->append("接收: " + QString::fromUtf8(data));
}

void frmTcpClient::onError(QAbstractSocket::SocketError error)
{
    Q_UNUSED(error)
    ui->txtReceive->append("错误: " + tcpSocket->errorString());
}

构建与运行

1. 命令行构建

bash 复制代码
# 清理构建
hvigorw clean

# 构建项目
hvigorw assembleHap

# 安装到设备
hdc install entry/build/default/outputs/default/entry-default-signed.hap

2. DevEco Studio构建

  1. 在DevEco Studio中,点击"Build" → "Build HAP(s)"
  2. 等待构建完成,确保无编译错误

3. 运行应用

由于目前HarmonyOS PC模拟器可能尚未普及,建议在真实PC设备上运行。

  1. 真实PC设备

    1. 准备已刷入HarmonyOS PC版的设备
    2. 通过USB连接设备
    3. 在DevEco Studio中选择目标设备
    4. 点击运行按钮,应用将自动安装并启动
  2. 远程调试

    1. 配置PC设备的远程调试选项
    2. 在DevEco Studio中配置远程连接
    3. 部署并运行应用

功能特性

NetTool移植到HarmonyOS PC平台后,保留了以下核心功能:

1. TCP客户端

  • 支持连接到远程TCP服务器
  • 支持发送和接收文本数据
  • 实时显示连接状态

2. TCP服务器

  • 支持创建TCP服务器,监听指定端口
  • 支持多客户端连接管理
  • 支持向指定客户端发送数据

3. UDP服务器

  • 支持UDP数据的接收和发送
  • 支持指定目标IP和端口发送数据
  • 实时显示接收到的UDP数据

4. 数据管理

  • 支持自定义发送数据
  • 支持保存发送历史
  • 支持多种数据格式显示(文本、十六进制)

5. 用户界面

  • 基于Qt Widgets设计,操作简单直观
  • 标签页式布局,功能模块清晰
  • 支持中英文界面切换

调试与优化

1. 常见问题解决

  1. 网络权限问题 :在module.json5中申请网络权限:

    json 复制代码
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]
  2. 库文件缺失:确保所有Qt库文件已正确拷贝到libs目录

  3. 架构不匹配 :确认设备架构与abiFilters配置一致

    注意,你的CMakeLists.txt`文件中,工程的名字是project(nettool VERSION 1.0.0)。因此,这里的名字要为libnettool.so

运行效果截图


当前存在的问题:虽然功能正常,但界面有些失真,尤其是字体和按钮大小,当前显示的字体明显偏小,跟最前面截图的效果差异明显。这些问题相信在后续的版本中肯定会解决,敬请关注!

未来展望

NetTool在HarmonyOS PC平台的应用开发具有重要价值:

  1. 开发者工具生态:丰富HarmonyOS PC平台的开发者工具,提高开发效率
  2. 网络调试标准化:为HarmonyOS应用开发提供标准的网络调试工具
  3. 跨设备调试:结合HarmonyOS分布式能力,实现跨设备网络调试
  4. 生态建设:推动HarmonyOS PC应用生态的快速成熟

随着HarmonyOS PC生态的完善,NetTool将成为开发者网络调试的重要工具,为HarmonyOS应用开发提供有力支持。

相关推荐
不爱吃糖的程序媛2 小时前
仓颉Nightly Builds版本正式解锁鸿蒙PC开发
华为·harmonyos
世转神风-2 小时前
qt-通信协议基础-uint64_t转QByteArray-小端系统
开发语言·qt
趁月色小酌***2 小时前
星盾护航 + AI 协同:鸿蒙 6.0 金融支付安全场景从 0 到 1 实战闯关
人工智能·金融·harmonyos
搬砖的kk2 小时前
鸿蒙 PC 三方库与命令行适配指南
华为·harmonyos
NocoBase2 小时前
GitHub Star 数量前 12 的 AI 工作流项目
人工智能·低代码·开源·github·无代码
前端世界2 小时前
HarmonyOS 分布式硬件实战指南:从原理到可运行 Demo
分布式·华为·harmonyos
说私域3 小时前
定制开发开源AI智能名片S2B2C商城小程序的产品经理职责与发展研究
人工智能·小程序·开源
世转神风-3 小时前
qt-uint64_t转QByteArray小端字节序并指定长度-小端系统
qt
无双@3 小时前
Github BettaFish 微舆docker部署教程 —— 打造你的八卦天团!
docker·容器·开源·github·微舆·bettafish