Qt常识

本文介绍了Qt Creator中QMainWindow、QWidget和QDialog的基本概念及其继承关系,并详细讲解了QDialog的应用方式,包括模态与非模态对话框的区别及设置方法。此外还介绍了断点调试技巧、qDebug()函数的使用以及信号与槽机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Qt Creator提供的默认基类只有QMainWindow、QWidget(基础窗口部件)和QDialog三种。
QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,QMainWindow和QDialog都是继承自QWidget。
QWidget继承自QObject类和QPaintDevice类。
Qt中销毁父对象时会自动销毁子对象。


断点调试

单步跳过F10:直接执行本行代码,然后指向下一行代码。
单步进入F11:进入调用的函数内部。
单步跳出shift+F11:配合单步进入使用。

只有程序进入主事件循环后才能接收事件。


qDebug()函数

将调试信息输出到控制台(应用程序输出Alt+3)
使用如qDebug(“x:%d”,x)时,不必包含头文件#include,但是使用qDebug()<< x ; 时必须包含头文件;
:pos()窗口位置。


QDialog

对话框包含:模态的(model)和非模态的(modeless)
model:在没有关闭之前不能再与同一个应用程序的其他窗口进行交互。
modeless:父子窗口同时出现,使用new来创建,show()来显示;
使用show()函数建立model时,要在前面加上setModel(true)函数。


信号和槽

slots关键字
在函数名上(Alt+Enter)即可在源文件中快速添加定义,或者右键->refactor。
手动关联:connect()将信号与槽进行关联,4个参数为:发射信号的对象、发射的信号、接收信号的对象、要执行的槽。
自动关联:将关联函数整合到槽命名中即:on_ 发射信号的部件对象_信号名()
如:on_showChlidB_clicked()

<think>我们参考提供的引用内容,尤其是引用[1][2][3]中关于QByteArray的使用方法和示例。用户需求是查找Qt中QByteArray的使用方法或相关功能,并请求示例。引用[1]展示了如何从十六进制字符串创建QByteArray,并提取数据。引用[2]进一步补充了如何从QString转换后创建QByteArray,以及注意事项。引用[3]则对比了QByteArray和QString的使用场景,指出QByteArray适用于存储原始二进制数据和内存敏感场景。因此,我们整理以下内容:1.QByteArray的创建和初始化2.从十六进制字符串转换3.与QString的相互转换4.常见操作(如数据提取、修改等)5.适用场景注意:由于引用内容有限,我们结合Qt常识补充一些常见用法。</think> ### Qt QByteArray 使用方法详解 `QByteArray` 是 Qt 中用于处理原始字节数据的核心类,特别适用于二进制数据处理和内存优化场景。以下是关键用法及示例: --- #### 1. **创建与初始化** ```cpp // 空字节数组 QByteArray empty; // 预分配大小 QByteArray buffer(1024, '\0'); // 1024字节的零初始化数组 // 从字符串字面量创建 QByteArray text("Qt is great!"); // 从十六进制字符串创建 [^1] QByteArray hexData = QByteArray::fromHex("517420697320677265617421"); qDebug() << hexData; // 输出: "Qt is great!" ``` --- #### 2. **数据类型转换** ```cpp // QString → QByteArray [^2] QString str = "Hello Qt"; QByteArray utf8Data = str.toUtf8(); // UTF-8编码 QByteArray latinData = str.toLatin1(); // Latin-1编码 // QByteArray → QString QString newStr = QString::fromUtf8(utf8Data); // 十六进制转换 QByteArray binary = QByteArray::fromHex("48656c6c6f"); // "Hello" qDebug() << binary.toHex(); // 输出: "48656c6c6f" ``` --- #### 3. **二进制数据处理** ```cpp // 原始数据访问 char* rawData = hexData.data(); // 获取C风格指针 [^1] int size = hexData.size(); // 获取字节数 // 数据修改 hexData.append("!!!"); // 追加数据 hexData.replace(3, 2, "was"); // 替换位置3开始的2字节 → "Qt was great!!!" // 子数组提取 QByteArray sub = hexData.mid(3, 5); // 从位置3取5字节 → "was" ``` --- #### 4. **内存高效操作** ```cpp // 预分配内存避免重复分配 [^3] QByteArray packet; packet.reserve(1500); // 为网络包预分配内存 // 共享数据(写时复制) QByteArray copy = hexData; // 浅拷贝,共享数据 copy[0] = 'q'; // 写操作触发深拷贝 ``` --- #### 5. **使用场景对比** | **场景** | **推荐类** | **原因** | |------------------------|----------------|--------------------------------------| | 文本处理/界面显示 | `QString` | 支持 Unicode,Qt API 集成度高 [^3] | | 网络数据/文件二进制读写 | `QByteArray` | 节省内存,直接处理原始字节 | | 嵌入式设备开发 | `QByteArray` | 内存资源受限时的优化方案 [^3] | --- #### 6. **完整示例:文件加密** ```cpp QFile file("data.bin"); if (file.open(QIODevice::ReadOnly)) { QByteArray encrypted = qCompress(file.readAll()); // 压缩数据 QByteArray hexEncrypted = encrypted.toHex(); // 转十六进制 file.close(); // 写入加密文件 QFile out("encrypted.dat"); if (out.open(QIODevice::WriteOnly)) { out.write(hexEncrypted); out.close(); } } ``` --- ### 关键注意事项 1. **编码处理**:使用 `toUtf8()`/`fromUtf8()` 保证多语言兼容性 2. **数据安全**:敏感数据使用后及时调用 `fill('\0')` 清空内存 3. **大文件处理**:避免一次性加载大文件,建议分块读取 > **适用性说明**:在非 ASCII 文本处理时优先使用 `QString`,但处理协议帧、加密数据、硬件通信等二进制场景时,`QByteArray` 具有不可替代的优势[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值