QT7_视频知识点笔记_4_文件操作,Socket通信:TCP/UDP

1.事件分发器,事件过滤器(重要程度:一般)

event函数

2.文件操作(QFile)

实现功能:点击按钮,弹出对话框,并且用文件类读取出内容输出显示在控件上。

#include <QFile>
#include <QFileDialog>
#include <QMessageBox>

...
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    //注意如果编译器不进行自动提示,1.看编译器是否有问题(本电脑MinGW-32不进行提示,MinGW-64正常,可能有配置没配对。2.看项目生成的地方,取消对应编译器shadow bulid的勾选)
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,[=]()
    {
        QString filename = QFileDialog::getOpenFileName(this,"open file","D:\\");
        if(filename.isEmpty() == true)
        {
            QMessageBox::warning(this,"warning","select file faild!");
            return ;
        }
        ui->textEdit->setText(filename);

        //创建一个文件对象
        QFile file(filename);
        //指定打开方式
        bool isok = file.open(QFile::ReadOnly);
        if(!isok)
        {
            QMessageBox::warning(this,"warning","file open faild!");
            return ;
        }
        //读文件,readAll返回QByteArray类型
        QByteArray array = file.readAll();
        //readAll是全部读完,或者也可以一行一行读
//        while(file.atEnd() == false){
//            array += file.readLine();
//        }
        //显示到文本框
        ui->textEdit->setText(array);

        //ui->textEdit->append();   //追加
        file.close();

    });

}

注意:可以用QTextCodec类改编码格式,使显示在UI控件上的不出现乱码

写文件:

		//写文件
        //创建一个文件对象
        QFile file1("D:/testnew.txt");
        //指定打开方式
        bool isok1 = file1.open(QFile::Append);
        //举例三种写入文件的调用方式
        file1.write(QString("Hello").toUtf8());
        char buf[128] = {0} ;
        file1.write(buf,strlen(buf));
        file1.write(buf);
        file1.close();
2.文件流操作

QTextStream操作的数据类型:文本流:基础数据类型:int,float,string等类型

        //使用流对象(方式1)QTextStream
        QTextStream steam(&file1);      //设置IO设备给流对象,file1为上文的QFile文件
        //写文件
        steam<<QString("hello,steam")<<123456;      //建议读出的时候不要采用"<<"符号,遇到空格就自动结束读取
        file1.close();


        QString buff1;
        file1.open(QFile::ReadOnly);
        steam.setDevice(&file1);
        steam>>buff1;   //把buff1写到流对象中去(文件中)
        qDebug()<<buff1.toUtf8().data();
        file1.close();

QDataStream操作的数据类型:数据流:二进制:QImage,QPoint QRect 不依耐平台

        //使用流对象(方式2)QDataStream
        QFile file1("D:/testnew.txt");
        QDataStream ds(&file1);
        //写
        ds<<QString("hello,steam")<<123456;
        file1.close();


        QString buff1;
        int num;    //与QTextStream的区别在此,需要与存入的数据格式完全一样
        file1.open(QFile::ReadOnly);
        ds.setDevice(&file1);
        //读
        ds>>buff1>>num;   //把内容写入到buff1中
        qDebug()<<buff1.toUtf8().data()<<num;
        //区别2:还可以对内存进行操作
        //例如传递图片信息
        QImage image("D:\\myheart.png");
        QByteArray aaaa;
        QDataStream ss(&aaaa,QIODevice::ReadWrite);
        ss<<image;
2.文件属性的类:QFileInfo

可查看很多文件的信息,例如大小,修改事件等。可在帮助文档中查看相关信息。

#include <QFileInfo>
#include <QDateTime>

        QFileInfo file_info("D:/testnew.txt");
        qDebug()<<"file size = "<<file_info.size();
        qDebug()<<"file path = "<<file_info.filePath();
        qDebug()<<"modify data:"<<file_info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
Socket通信:TCP/UDP(TCPIP部分)

最后能实现一个服务器一个客户端能相互传输文件等。

例子:创建一个项目,有两个顶层窗口,一个是服务器(需要连接QTcpServer和QTcpSocket),一个是客户端(只需要连接QTcpSocket)

服务器:QTcpServer进行监听,QTcpSocket进行通信
服务器1.server绑定(IP,port);2.server进入监听状态listen;3.Server收到信号newConnection(),socket套接字nextPendingConnection;4.socket套接字发送/接收数据:write函数 readAll函数(readyRead信号)

//QT  pro文件中:(加入network)
QT       += core gui network   
//.h文件中
#include <QTcpServer>
#include <QTcpSocket>

    QTcpServer* server;     //监听的套接字
    QTcpSocket* conn;    //通信的套接字


Server::Server(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Server)
{
    ui->setupUi(this);

    //TCPserver实例化
    server = new QTcpServer(this);  //指定父对象,窗口释放也会被随之释放

    ui->S_IP->setText("127.0.0.1");
    ui->S_port->setText("9999");
    //监听
    server->listen(QHostAddress(ui->S_IP->text()),ui->S_port->text().toInt());

    //新的连接
    connect(server, &QTcpServer::newConnection,this,[=](){
        //第一步:接收客户端的套接字对象,返回值为QTcpSocket
        conn = server->nextPendingConnection();
        //发送数据,(使用conn)
        conn->write(("HELLO client,this is server"));


        //连接需要写到这,才能保证conn是个有效的对象
        connect(conn,&QTcpSocket::readyRead,this,[=](){
            //接收数据
            QByteArray array = conn->readAll();
            ui->textEdit_S_record->append(array);

        });

    });

    //发送
    connect(ui->pushButton_S_send,&QPushButton::clicked,this,[=](){

        QString writeString = ui->textEdit_S_msg->toPlainText();
        conn->write(writeString.toUtf8());  //格式转换
        ui->textEdit_S_record->append("My say:"+ui->textEdit_S_msg->toPlainText());
        //clear
        ui->textEdit_S_msg->clear();

    });


}

客户端:

#include <QTcpSocket>
...
QTcpSocket * client;


Client::Client(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);

    ui->C_IP->setText("127.0.0.1");
    ui->C_port->setText("9999");

    //初始化(实例化)
    client = new QTcpSocket(this);

    QString C_IP = ui->C_IP->text();
    client->connectToHost(QHostAddress(ui->C_IP->text()),ui->C_port->text().toInt());
    //client->connectToHost("127.0.0.1",9999);

    //接收数据
    connect(client,&QTcpSocket::readyRead,this,[=](){
        qDebug()<<"client,&QTcpSocket::readyRead";
        QByteArray array= client->readAll();
        ui->textEdit_C_record->append(array);

    });

    //发送数据
    connect(ui->pushButton_C_send,&QPushButton::clicked,this,[=](){
        client->write(ui->textEdit_C_msg->toPlainText().toUtf8());
        ui->textEdit_C_record->append("Me say:" + ui->textEdit_C_msg->toPlainText());

    });

}

最后在main文件中:
加入两窗口同时显示:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Server w;
    w.setWindowTitle("Server");
    w.show();

    Client c;
    c.setWindowTitle("Client");
    c.show();

    return a.exec();
}

最后的效果:
在这里插入图片描述

Socket通信:TCP/UDP(UDP部分)

UDP:面向无连接
对于UDP没有客户端和服务器之分,程序上来看都是一样的,都使用QUdpSocket
发送数据:writeDatagrame()
发送:指定对方的IP,对方的端口,发送的数据
接收数据:如果有信号发过来,收到信号:readyRead
需要绑定端口(本地):readatagrame()

int  size = s.pendingDatagramSize();
QByteArray array(size,0);
s.readDatagram(buf.data(),size);
//如果要接收数据,则要绑定端口(本地)

QT pro文件添加network

广播和组播

广播地址:255.255.255.255
组播地址:需要设置(如果需要接收组播消息,需要加入到组播地址,join)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/635590.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第八课,分支语句嵌套、随机数函数、初识while循环

一&#xff0c;分支结构的嵌套语法 在 Python 中&#xff0c;分支结构可以嵌套&#xff0c;这意味着你可以在一个条件语句中包含另一个条件语句。嵌套的分支结构可以让你更灵活地控制程序的逻辑流程。 怎么理解呢&#xff1f;打个比方&#xff1a;放学后&#xff0c;请三年级…

深度学习之基于Tensorflow卷积神经网络(CNN)实现猫狗识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在人工智能和深度学习的热潮中&#xff0c;图像识别是一个备受关注的领域。猫狗识别作为图像识…

AcWing 217:绿豆蛙的归宿 ← 搜索算法

【题目来源】https://www.acwing.com/problem/content/219/【题目描述】 给出一个有向无环的连通图&#xff0c;起点为 1&#xff0c;终点为 N&#xff0c;每条边都有一个长度。 数据保证从起点出发能够到达图中所有的点&#xff0c;图中所有的点也都能够到达终点。 绿豆蛙从起…

DDR5—新手入门学习(一)【1-5】

目录 1、DDR背景 &#xff08;1&#xff09;SDR SDRAM时代 &#xff1a; &#xff08;2&#xff09;DDR SDRAM的创新 &#xff1a; &#xff08;3&#xff09;DDR技术的演进 &#xff1a; &#xff08;4&#xff09;需求推动&#xff1a; 2、了解内存 &#xff08;1&…

k8s笔记 | Prometheus安装

kube-prometheus 基于github安装 选择对应的版本 这里选择 https://github.com/prometheus-operator/kube-prometheus/tree/release-0.11 下载修改为国内镜像源 image: quay.io 改为 quay.mirrors.ustc.edu.cn image: k8s.gcr.io 改为 lank8s.cn 创建 prometheus-ingres…

教师专属的成绩发布小程序

还在为成绩发布而烦恼&#xff1f;还在担心家长无法及时获得孩子的学习反馈&#xff1f;是否想要一个既安全又高效的工具来简化你的教学工作&#xff1f;那么&#xff0c;易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担&#xff0c;提高…

Harmony学习笔记一——项目创建及配置

文章基于Harmony Next Preview2 进行学习&#xff0c;其他版本可能会稍有不同 准备工作 由于目前Harmony Next仅有Preview版本&#xff0c;想要进行Harmony Next开发需要向华为申请权限&#xff0c;具体操作参考: https://developer.huawei.com/consumer/cn/forum/topic/02081…

YOLOV8 如何训练自己的数据

1、git code 项目 地址 2、数据标注&#xff1a;使用yolov8官方推荐的roboflow 地址 2.1 上传数据 2.2 标注 2.3 生成数据集 2.4 导出数据 3 训练 3.1 建.yaml 文件 建立.yaml 文件 3.2 修改.yaml文件里面的内容 1.这是roboflow 网站下下来的数据&#xff0c;只需要把.…

常见算法(2)

1.冒泡排序 定义&#xff1a;相邻的数据两两比较&#xff0c;小的放前面&#xff0c;大的放后面。 public class test {public static void main(String [] arg) {int [] arr {2,4,5,3,6,1};//冒泡排序&#xff0c;排序次数arr.length-1for(int i0;i<arr.length-1;i) {f…

Blazor入门-简单svg绘制+导出图像

参考&#xff1a; SVG 教程 | 菜鸟教程 https://www.runoob.com/svg/svg-tutorial.html 本地环境&#xff1a;win10, visual studio 2022 community 注意&#xff1a;本文只给出思路和框架&#xff0c;对于具体的计算细节&#xff0c;考虑到日后会写入软件著作权和专利文书&am…

visio生成pdf文件有黑边(边框),插入latex输出有边框

解决办法&#xff1a; 1 文件-导出pdf-点击“选项” 2 选择取消勾选

HTML静态网页成品作业(HTML+CSS)——利物浦足球俱乐部介绍网页设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;共有5个页面。 二、作品演示 三、代码目录 四、网站代码 HTML部分代…

TikTok矩阵管理系统:品牌增长的新引擎

随着社交媒体的快速发展&#xff0c;TikTok已成为全球最受欢迎的短视频平台之一。品牌和企业纷纷涌入这个平台&#xff0c;寻求新的增长机会。然而&#xff0c;随着内容的激增和用户群体的多样化&#xff0c;管理TikTok账号变得越来越复杂。这时&#xff0c;TikTok矩阵管理系统…

LLaMa系列模型详解(原理介绍、代码解读):LLaMA 3

LLaMA 3 2024年4月18日&#xff0c;Meta 重磅推出了Meta Llama 3&#xff0c;Llama 3是Meta最先进开源大型语言模型的下一代&#xff0c;包括具有80亿和700亿参数的预训练和指令微调的语言模型&#xff0c;能够支持广泛的应用场景。这一代Llama在一系列行业标准基准测试中展示…

数据仓库实验四:聚类分析实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、建立数据表2、建立数据源视图3、建立挖掘结构Student.dmm4、部署项目并浏览结果5、挖掘模型预测 四、实验结果分析五、实验总结体会 一、实验目的 通过本实验&#xff0c;进一步理解基于划分的、基于层次的、基于密度的聚类…

Python 渗透测试:GhostScript 沙箱绕过.(CVE-2018-16509)

什么是 GhostScript 沙箱绕过 GhostScript 沙箱是一种安全机制,用于在受控环境中运行 GhostScript 解释器,以防止恶意代码的执行。GhostScript 是一个广泛使用的 PDF 和 PostScript 解释器,通常用于在服务器上处理和渲染这些文件格式。Tavis Ormandy 通过公开邮件列表&#xf…

[Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解

目录 1.不同路径1.题目链接2.算法原理详解3.代码实现 2.不同路径 II1.题目链接2.算法原理详解3.代码实现 3.珠宝的最高价值1.题目链接2.算法原理详解3.代码实现 1.不同路径 1.题目链接 不同路径 2.算法原理详解 思路&#xff1a; 确定状态表示 -> dp[i][j]的含义 走到dp[…

docker和containerd的区别

docker和containerd的区别 1、容器运行时 1.1 容器运行时概念 容器运行时&#xff08;Container Runtime&#xff09;是一种负责在操作系统层面创建和管理容器的软件工具或组件。它是容器化技术的核心组件之一&#xff0c;用于在容器内部运行应用程序&#xff0c;并提供隔离…

pdf加水印怎么加?3种添加水印方法分享

pdf加水印怎么加&#xff1f;PDF加水印不仅是为了保护文档内容&#xff0c;确保信息的安全性和完整性&#xff0c;更是一种有效的版权保护措施。通过添加水印&#xff0c;您可以在文档中嵌入公司名称、日期、编号等信息&#xff0c;以明确文档的归属权和使用限制。此外&#xf…

Anti Desgin Vue 实现 表格可编辑、新增、删除功能

1、效果图 新增&#xff1a; 删除&#xff1a; 修改&#xff1a; 代码&#xff1a; <template><div><button click"add">添加</button><span style"margin-left: 8px"><template v-if"hasSelected">{…