当前位置:   article > 正文

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

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();

    });

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

注意:可以用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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
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();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
        //区别2:还可以对内存进行操作
        //例如传递图片信息
        QImage image("D:\\myheart.png");
        QByteArray aaaa;
        QDataStream ss(&aaaa,QIODevice::ReadWrite);
        ss<<image;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
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");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
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;    //通信的套接字

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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();

    });


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

客户端:

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

  • 1
  • 2
  • 3
  • 4

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());

    });

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

最后在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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

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

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
QT pro文件添加network

  • 1
  • 2
广播和组播

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/601148
推荐阅读
相关标签
  

闽ICP备14008679号