目录
26 QByteArray 是 Qt 框架中的一个类,用于处理字节数组。它提供了动态大小的字节数组,可以用于存储和操作二进制数据,比如文件内容、网络数据等。
一:常用类
26 QByteArray
是 Qt 框架中的一个类,用于处理字节数组。它提供了动态大小的字节数组,可以用于存储和操作二进制数据,比如文件内容、网络数据等。
构造与析构
QByteArray()
: 默认构造函数。QByteArray(const char *str)
: 从 C 字符串构造。QByteArray(const QByteArray &other)
: 拷贝构造函数。大小与容量
int size() const
: 返回字节数组的大小。int capacity() const
: 返回当前分配的内存容量。void resize(int size)
: 修改数组大小。数据访问
const char* constData() const
: 返回只读数据指针。char* data()
: 返回可写数据指针。char operator[](int i) const
: 按索引访问元素。字符串操作
QByteArray append(const QByteArray &other)
: 追加另一个字节数组。QByteArray prepend(const QByteArray &other)
: 在前面添加字节数组。QByteArray mid(int pos, int len = -1) const
: 提取子数组。查找与替换
int indexOf(const QByteArray &ba, int from = 0) const
: 查找子数组的索引。void replace(int pos, int len, const QByteArray &ba)
: 替换子数组。编码与解码
QByteArray toBase64() const
: 转换为 Base64 编码。QByteArray fromBase64(const QByteArray &ba)
: 从 Base64 解码。比较与赋值
bool operator==(const QByteArray &other) const
: 比较相等性。QByteArray& operator=(const QByteArray &other)
: 赋值操作符。在json中的使用:
QByteArray jsonBytes = doc.toJson();
这行代码的意思是将一个QJsonDocument
对象doc
转换为 JSON 格式的字节数组。
doc.toJson()
:
- 这个方法将
QJsonDocument
转换为 JSON 字符串,返回一个QByteArray
。- 字节数组是这样的 {"name":"Alice","age":30}
- 默认情况下,它生成紧凑格式的 JSON 字符串。
QByteArray jsonBytes
:
jsonBytes
是一个字节数组,存储转换后的 JSON 数据。用途
- 传输:可以将
jsonBytes
用于网络传输,例如通过 HTTP 请求发送数据。- 存储:可以将
jsonBytes
写入文件或数据库中,以便将 JSON 数据持久化。- 进一步处理:可以对
jsonBytes
进行编码、压缩等其他处理。
27 QJsonObject
是 Qt 框架中用于表示 JSON 对象的类。它提供了一个键值对的集合,可以存储各种数据类型,包括数字、字符串、数组、布尔值和其他 JSON 对象。
- 表示一个 JSON 对象,存储键值对(类似于字典或映射)。
- 用途:
- 用于表示 JSON 数据的一个部分,可以存储字符串、数字、布尔值、数组或其他 JSON 对象。
- 常用方法:
insert(const QString &key, const QJsonValue &value)
: 插入或更新键值对。remove(const QString &key)
: 移除指定键。contains(const QString &key) const
: 检查是否包含特定键。QJsonValue operator[](const QString &key) const
: 通过键访问对应的值。QList<QString> keys() const
: 获取所有键的列表。
序列化与反序列化
- 可以通过
QJsonDocument
来序列化和反序列化QJsonObject
。
28 QJsonDocument 表示一个完整的 JSON 文档,可以是一个 JSON 对象或 JSON 数组。
用途:
用于序列化和反序列化 JSON 数据,将
QJsonObject
或QJsonArray
转换为 JSON 字符串,或从字符串解析为对象。常用方法:
setObject(const QJsonObject &object)
: 设置 JSON 文档为一个 JSON 对象。setArray(const QJsonArray &array)
: 设置 JSON 文档为一个 JSON 数组。QJsonObject object() const
: 获取文档中的 JSON 对象(如果是对象)。QJsonArray array() const
: 获取文档中的 JSON 数组(如果是数组)。QString toJson(Format format = Compact) const
: 将 JSON 文档转换为字符串,支持紧凑和缩进格式。static QJsonDocument fromJson(const QByteArray &data)
: 从 JSON 字符串解析出QJsonDocument
。
29 QJsonParseError
是 Qt 中用于表示 JSON 解析错误的类。它通常与QJsonDocument
类一起使用,用于在解析 JSON 字符串时报告任何错误。
30 QVariant
是 Qt 提供的一个通用值类,可以存储几乎所有 Qt 支持的数据类型的值
是 Qt 提供的一个通用值类,可以存储几乎所有 Qt 支持的数据类型的值,包括基本数据类型(如整数、浮点数、布尔值等)、复杂数据类型(如字符串、列表、映射等)以及用户自定义的数据类型。
31 QSettings
是 Qt 框架中的一个类,用于在应用程序中存储和读取配置信息。
QT项目记录:
问题记录1: Json的序列化和反序列化
序列化定义:将数据结构(如对象、数组等)转换为 JSON 格式的字符串。
用途:
- 将数据保存到文件或数据库。
- 在网络传输中发送数据。
示例:
QJsonObject obj; obj["name"] = "Alice"; obj["age"] = 30; QString jsonString = QJsonDocument(obj).toJson(QJsonDocument::Compact); //Compact:表示生成的 JSON 字符串将采用紧凑格式。 //也就是说,输出的 JSON 字符串不包含任何多余的空格或换行符, //所有内容都在一行上,以最小化文件大小。
反序列化定义:将 JSON 格式的字符串解析为原始的数据结构(如对象、数组等)。
用途:
- 从文件或数据库读取数据并恢复为可用的对象。
- 接收网络数据并转换为程序中可用的格式。
示例:
QString jsonString = "{\"name\":\"Alice\",\"age\":30}"; QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8()); QJsonObject obj = doc.object(); QString name = obj["name"].toString(); int age = obj["age"].toInt();
总结:
- 序列化:将对象转为 JSON 字符串。
- 反序列化:将 JSON 字符串转为对象。
问题记录2:Json对象可以处理,为什么还要将json文档设置为一个json对象呢?
完整性:
QJsonDocument
可以表示整个 JSON 文档,包含一个 JSON 对象或 JSON 数组。它用于处理整个结构,而不仅仅是单一的键值对集合。序列化与反序列化:
QJsonDocument
提供了方便的方法,将 JSON 对象或数组转换为字符串(序列化)或从字符串解析为 JSON 对象/数组(反序列化)。例如,可以将整个 JSON 文档保存到文件或发送到网络。格式化输出:
- 可以使用
QJsonDocument
控制输出的格式,例如生成紧凑的 JSON 字符串或可读性更好的缩进格式。
- 使用
QJsonObject
:当你只需要处理 JSON 对象的键值对时,可以使用QJsonObject
。- 使用
QJsonDocument
:当需要处理整个 JSON 数据结构,包括需要转换为字符串或解析时,就需要使用QJsonDocument
。
问题记录3:QT种如何起一个服务器?
问题记录4:QStackedWidget中通过代码写的页是不能在ui设计的界面中看到?
因为没有运行,就不会整合代码,ui设计是ui设计,代码是代码。只有在运行的时候,会在窗口中共同显示。
ui->stackedWidget->addWidget(p->from);//将页面显示区域中的一页设置为p->from ui->stackedWidget->addWidget(p->musiclist); ui->verticalLayout->addWidget(p->musicForm); //这里是在代码中添加的页,但是在.ui文件中是不能看到的。 //因为,他们根本就不挨着,是分开的,只有在运行时才会显示到界面上去。
问题记录5:layout可以单独使用?
layout单独使用,可以直接将控件拖到窗口中。然后在layout中添加其他控件,这样layout中的控件就能自动布局了。
问题记录6:C中sprintf()函数如何使用
char buf[4096] = {0}; sprintf(buf,"%s%s",count.toStdString().c_str(),pwd.toStdString().c_str());
buf
:
- 这是一个字符数组,用于存储格式化后的结果。
"%s%s"
:
- 格式字符串,表示将两个字符串拼接在一起。
count.toStdString().c_str()
:
- 将
count
转换为标准字符串,然后获取其 C 风格字符串指针。
pwd.toStdString().c_str()
:
- 将
pwd
转换为标准字符串,然后获取其 C 风格字符串指针。结果
sprintf()
将count
和pwd
的字符串值拼接并存入buf
中。
问题记录7:QTcpSocket::readyRead()这个信号什么时候可以被触发。
触发条件
- 有数据可读:
- 当从远程主机接收到数据并且这些数据可用时,
readyRead
信号会被发射。- 这意味着 TCP 连接上有新的数据到达,可以通过调用
read()
,readAll()
, 或readLine()
等方法读取。具体场景
客户端:
- 如果你有一个 TCP 客户端连接到服务器,并且服务器发送了一些数据,
readyRead
信号会被触发,通知客户端可以读取这些数据。服务器:
- 在服务器端,当客户端发送请求或数据时,服务器的
QTcpSocket
对象会接收到数据,并发出readyRead
信号。
通过样式表文件.qss文件,设置widget的边框线为灰色
QWidget
{
border-top: 2px solid gray;
}
border-top
: 这个属性用于定义上边框的样式。
2px
: 边框的宽度为 2 像素。solid
: 边框类型为实线。gray
: 边框颜色为灰色。
通过样式表设置自定义界面类中的控件样式
//在前面声明是那个类 musicinfobar QPushButton#pushButton_touxiang { border-radius: 20px; background-color:rgb(38,206,170); }
问题记录8:如何使用自定义的设计师界面类?
//如何将自定义按钮添加到指定的位置呢
//大致的思路都是这样的,自定义一个设计师界面类后,首先先将实例化一个对象,通过类的函数来使用ui指针如在类内设置函数setname,set,填充自定义的界面,之后通过主界面的中控件的函数add...一类的函数,将自定义控件塞到,主界面控件中
QListWidgetItem *item = new QListWidgetItem; SongList* sl = new SongList; //自定义的类 QStringList lineList = path3.split("-"); item->setSizeHint(sl->size()); ui->songlist->addItem(item); ui->songlist->setItemWidget(item,sl); sl->SetSongName(lineList[0]); //调用自定义的类的函数,来设置自定界面中的内容 sl->SetSongerName(lineList[1]);
QFileInfo中文件操作中的两个函数
fileName()
函数:
- 定义:
QString fileName() const;
- 用途:获取包含路径的完整文件名,包括文件的扩展名。
baseName()
函数:
- 定义:
QString baseName() const;
- 用途:获取文件的基本名称,即不包括路径和扩展名的部分。
问题记录9:在QT中listwidget中的每行item都可以放一个数据,如何放入数据,如何去除数据
//将数据放入item使用setData函数,如下: listitem->setData(Qt::UserRole,ite->path() + "/" + ite->fileName()); 如何使用放到item中的数据呢,定位到listwidget的当前行,然后使用data取出数据,如下: QString MusicPath = ui->listWidget_localmusic->currentItem()- >data(Qt::UserRole).toString();
问题记录10:QT中对于一个音乐路径,怎样按某个特定的字符分成的所有段,全部放到一个list里面
//按照==分割,将分割的所有段,放到linelist列表中 QStringList linelist = line.split("="); //访问这个列表使用数组下标的方式来进行访问。 QString love = linelist[1];
问题记录10:在主界面类中将其他自定义界面类作为主界面的成员变量,这个就叫做组合,维护一个该自定义界面类的指针,就可以动态的管理这个界面了,也就可以不断的更新这个对象了。
如何使用
infoBar
对象:
在主界面类中声明
infoBar
对象:musicinfobar *infoBar;
在构造函数或初始化阶段创建
infoBar
对象:// 假设在构造函数或初始化阶段创建 musicinfobar 对象 infoBar = new musicinfobar(/* 传递相应的参数 */); verticalLayout->addWidget(infoBar);
根据需要更新
infoBar
对象的内容:// 在槽函数或其他需要的地方,根据用户操作或其他条件更新 infoBar 对象的内容 void MainWindow::onListItemClicked(QListWidgetItem *item) { // 可以根据点击的项更新 infoBar 对象的内容 int index = listWidget->row(item); infoBar->updateMusicInfo(/* 根据 index 更新音乐信息 */); }
注意事项:
内存管理:你需要确保在适当的时候释放
infoBar
对象的内存,通常在主界面类的析构函数中释放:MainWindow::~MainWindow() { delete infoBar; }
这样可以避免内存泄漏。
对象的生命周期:
infoBar
对象的生命周期与主界面类对象的生命周期相同,因此它会在主界面类对象销毁时自动释放。更新内容:使用
infoBar
对象时,可以直接调用它的方法来更新显示的内容,而无需每次重新创建对象。通过以上方法,你可以在主界面中维护一个
musicinfobar
对象,并利用它来实现在QVBoxLayout
中动态显示和更新音乐信息的功能。
问题记录11:如何将一个把一张图片,设置到一个按钮上面
QString imagePath = "/path/to/poster.png"; // 替换为你的海报文件路径 QPixmap posterPixmap(imagePath); //示例 QPixmap pix(path); ui->pushButton_touxiang->setIcon(pix); ui->pushButton_touxiang->setIconSize(QSize(50, 50)); // 设置图标大小
问题记录12:QT中的绘图事件paintEvent,怎么使用
作用:
paintEvent
用于绘制窗口部件的内容,例如绘制文本、图形、图像等。- 当窗口部件的内容需要更新或者需要重新绘制时,Qt 会自动触发
paintEvent
函数来执行绘制操作。调用时机:
paintEvent
函数在窗口部件第一次显示、大小变化、窗口内容需要更新时等情况下被自动调用。- 开发者也可以手动调用
QWidget::update()
函数来触发paintEvent
,以实现手动刷新界面。
问题记录13:在使用QT的C/S网路通信时,始终连接不上
遇到这个问题时,因为所连接的无线网,科学上网也开着的,所以就一直连接不成功,这个在连接的时候一定的要关闭才行。
问题记录14:怎样在QT中创建一个数据呢?
答案是,一般情况下,我们不需要在Qt上创建数据,我们可以在QT上使用MySQL服务器型数据库,因为,MySQL数据是服务器型数据库,既然是服务器型,就要部署在远端,远端的操作系统一般是Linux系统,所以,我们一般是在Linux上创建数据库,然后在Qt中使用它。
问题记录15:在Linux上使用MySQL数据库的全流程
1. 安装 MySQL 服务器
sudo apt update # 更新包列表(仅适用于Debian/Ubuntu) sudo apt install mysql-server # 安装MySQL服务器
2. 启动 MySQL 服务
sudo systemctl status mysql # 检查MySQL服务状态 sudo systemctl start mysql # 启动MySQL服务 sudo systemctl enable mysql # 设置MySQL服务开机自启(可选)
3. 连接到 MySQL 数据库
mysql -u 用户名 -p
4. 创建数据库
CREATE DATABASE IF NOT EXISTS dbname;
5. 创建用户并授权(可选)
CREATE USER '新用户名'@'localhost' IDENTIFIED BY '密码'; GRANT ALL PRIVILEGES ON dbname.* TO '新用户名'@'localhost'; FLUSH PRIVILEGES;
6. 执行基本操作
USE dbname; -- 切换到你创建的数据库 CREATE TABLE 表名 ( 列名1 数据类型, 列名2 数据类型, ... );
7. 断开连接和关闭服务
quit; -- 退出MySQL命令行客户端 sudo systemctl stop mysql # 停止MySQL服务
问题记录16:怎样进行大文件传输,如发送.mp3文件,怎么发送。
问题记录17:在Qt上创建MySQL的连接对象,进行连接的时候,连接不上远端MySQL服务器问题。
//使用Qt只能使用已经创建好的动态库来使用,因为Qt没有加载指定的数据库驱动程序 //所以要在服务器上创建好数据,写好接口,然后制作成动态库,最后将动态库添加到.exe可执行文件所在文件夹下。
问题记录18: 怎样将utf-8编码转为GB2312中文。
由于notepad++中不可截图这里详细说明:首先转为ANSI编码,然后使用找到编码字符集,在编码字符集中找到中文,然后选择GB2312。
问题记录19:如通过listWidget中的当前行的行号,拿到item的指针 ListWidget*item 指针 。
//拿到当前行 int currentRow = ui->listWidget_localmusic->currentRow(); //通过listwidget的行号,拿到它的*item指针 QListWidgetItem* item = ui->listWidget_localmusic->item(upRow);
问题记录20:listWidget的信号中QListWidget::clicked信号没有返回值
QListWidget::clicked信号,无返回值。
QListWidget::ItemClicked信号有返回值,返回值为QListWidgetItem*类型的
问题记录21 : comboBoxQt中可以下拉选择的控件。