随着OpenHarmony生态向PC端扩展,网络调试工具成为开发者日常工作中不可或缺的工具。NetTool作为一款基于Qt Widgets的开源网络调试助手,支持TCP客户端、TCP服务器、UDP服务器等多种网络通信功能,非常适合移植到HarmonyOS PC平台。本文将详细介绍如何将NetTool移植到HarmonyOS PC环境,为开发者提供一个功能完善的网络调试工具。
注意:本文使用的Qt for OpenHarmony SDK由OpenHarmony SIG社区基于Qt 5.15独立开发和维护,非Qt官方版本。
- 社区项目地址:https://gitcode.com/openharmony-sig/qt
- SDK下载链接:https://gitcode.com/openharmony-sig/qt/releases
NetTool在HarmonyOS PC端的优势
NetTool作为一款成熟的网络调试工具,其丰富的网络通信功能和直观的用户界面非常适合移植到HarmonyOS PC平台。
通过移植,NetTool将能够:
- 充分利用Qt Widgets:NetTool基于Qt Widgets模块,可以无缝适应HarmonyOS PC的桌面环境。
- 多种网络协议支持:支持TCP客户端、TCP服务器、UDP服务器等多种网络通信模式。
- 数据格式灵活:支持多种数据格式的发送和接收,满足不同调试需求。
- 跨平台一致性:保持与原版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 及以上版本
前置条件
- 安装DevEco Studio 5.0及以上版本
- 下载并配置Qt for OpenHarmony SDK
- 了解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平台示例:
-
打开终端,创建目录并解压SDK。
bashmkdir ~/QtForOpenHarmony cd ~/Downloads tar -xf Qt5.15.12_alpha_v7_arm64-v8a_openharmony_ndk_5.0.3.135_community_macos.tar.gz -C ~/QtForOpenHarmony -
验证安装。
bashcd ~/QtForOpenHarmony/bin ./qmake -query如果输出中包含
QMAKE_XSPEC:oh-clang,则表明Qt for OpenHarmony SDK安装成功。
Windows平台注意:
- 使用解压工具(如7-Zip)将SDK压缩包解压到指定目录,例如
C:\QtForOpenHarmony。 - 后续在DevEco Studio配置中,使用对应的Windows路径。
如未完成,请参考前文《QT开发鸿蒙移动应用:环境搭建及第一个HelloWorld程序》中的环境搭建部分。
下载与准备NetTool源码
-
下载NetTool源码 :源码地址
-
解压源码 :将下载的源码包解压到一个工作目录,例如
~/Projects/nettool-hmos。源码可直接放置到 entry/src/main/cpp目录。

创建HarmonyOS工程
1. 新建HarmonyOS工程
- 打开DevEco Studio,选择"Create Project"。
- 选择"Native C++"模板。
- 配置工程信息:
- Project Name :
NetTool - Bundle Name :
com.example.nettool - Save Location : 工程保存路径(如
~/Projects/nettool-hmos) - Compile SDK: 选择API 12或更高版本
- Model: 选择"Stage"
- Project Name :
- 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 拷贝依赖文件
- 拷贝ets文件 :将Qt SDK下的
openharmony/qtbase目录内容复制到src/main/ets目录(直接覆盖)。 - 拷贝库文件 :将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构建
- 在DevEco Studio中,点击"Build" → "Build HAP(s)"
- 等待构建完成,确保无编译错误
3. 运行应用
由于目前HarmonyOS PC模拟器可能尚未普及,建议在真实PC设备上运行。
-
真实PC设备
- 准备已刷入HarmonyOS PC版的设备
- 通过USB连接设备
- 在DevEco Studio中选择目标设备
- 点击运行按钮,应用将自动安装并启动
-
远程调试
- 配置PC设备的远程调试选项
- 在DevEco Studio中配置远程连接
- 部署并运行应用
功能特性
NetTool移植到HarmonyOS PC平台后,保留了以下核心功能:
1. TCP客户端
- 支持连接到远程TCP服务器
- 支持发送和接收文本数据
- 实时显示连接状态
2. TCP服务器
- 支持创建TCP服务器,监听指定端口
- 支持多客户端连接管理
- 支持向指定客户端发送数据
3. UDP服务器
- 支持UDP数据的接收和发送
- 支持指定目标IP和端口发送数据
- 实时显示接收到的UDP数据
4. 数据管理
- 支持自定义发送数据
- 支持保存发送历史
- 支持多种数据格式显示(文本、十六进制)
5. 用户界面
- 基于Qt Widgets设计,操作简单直观
- 标签页式布局,功能模块清晰
- 支持中英文界面切换
调试与优化
1. 常见问题解决
-
网络权限问题 :在
module.json5中申请网络权限:json"requestPermissions": [ { "name": "ohos.permission.INTERNET" } ] -
库文件缺失:确保所有Qt库文件已正确拷贝到libs目录
-
架构不匹配 :确认设备架构与abiFilters配置一致
注意,你的CMakeLists.txt`文件中,工程的名字是project(nettool VERSION 1.0.0)。因此,这里的名字要为libnettool.so:

运行效果截图

当前存在的问题:虽然功能正常,但界面有些失真,尤其是字体和按钮大小,当前显示的字体明显偏小,跟最前面截图的效果差异明显。这些问题相信在后续的版本中肯定会解决,敬请关注!
未来展望
NetTool在HarmonyOS PC平台的应用开发具有重要价值:
- 开发者工具生态:丰富HarmonyOS PC平台的开发者工具,提高开发效率
- 网络调试标准化:为HarmonyOS应用开发提供标准的网络调试工具
- 跨设备调试:结合HarmonyOS分布式能力,实现跨设备网络调试
- 生态建设:推动HarmonyOS PC应用生态的快速成熟
随着HarmonyOS PC生态的完善,NetTool将成为开发者网络调试的重要工具,为HarmonyOS应用开发提供有力支持。