[QT开发_音乐播放器项目笔记01]

目录

一:常用类

26 QByteArray 是 Qt 框架中的一个类,用于处理字节数组。它提供了动态大小的字节数组,可以用于存储和操作二进制数据,比如文件内容、网络数据等。

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 数据,将 QJsonObjectQJsonArray 转换为 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());
  1. buf

    • 这是一个字符数组,用于存储格式化后的结果。
  2. "%s%s"

    • 格式字符串,表示将两个字符串拼接在一起。
  3. count.toStdString().c_str()

    • count 转换为标准字符串,然后获取其 C 风格字符串指针。
  4. pwd.toStdString().c_str()

    • pwd 转换为标准字符串,然后获取其 C 风格字符串指针。

结果

  • sprintf()countpwd 的字符串值拼接并存入 buf 中。

问题记录7:QTcpSocket::readyRead()这个信号什么时候可以被触发。

触发条件

  1. 有数据可读
    • 当从远程主机接收到数据并且这些数据可用时,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 对象:

  1. 在主界面类中声明 infoBar 对象

    musicinfobar *infoBar;
    
  2. 在构造函数或初始化阶段创建 infoBar 对象

    // 假设在构造函数或初始化阶段创建 musicinfobar 对象
    infoBar = new musicinfobar(/* 传递相应的参数 */);
    verticalLayout->addWidget(infoBar);
    
  3. 根据需要更新 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中可以下拉选择的控件。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值