当前位置:   article > 正文

QT入门学习(三)_writedatagram

writedatagram

QT-TCP通信

tcp通信的步骤:十几行代码实现TCP通信。
在这里插入图片描述
QT的tcp通信机制:
在这里插入图片描述

TCP聊天程序

首先创建TCP的服务器和客户端,如图所示:
在这里插入图片描述
设计一个普通界面,并且对这个普通界面进行布局。
在这里插入图片描述
之后在代码区对代码进行填充:
1、首先添加类,否则头文件报错,无法进行编译。
在这里插入图片描述在这里插入图片描述
首先在server.h中添加头文件。

#include <QTcpServer>
#include <QTcpSocket>
  • 1
  • 2

并且在类中定义新的套接字。

private:
    Ui::Server *ui;
    QTcpServer* server;//监听的套接字
    QTcpSocket* conn;//通信的套接字
  • 1
  • 2
  • 3
  • 4

在server.cpp中添加如下代码。

Server::Server(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Server)
{
    ui->setupUi(this);
    //初始化
    ui->sIP->setText("127.0.0.1");//设置IP窗口初始化显示的IP地址
    ui->sPort->setText("9999");//设置初始化显示的端口号
    //实例 init
    server = new QTcpServer(this);
    //监听
    server->listen(QHostAddress(ui->sIP->text()),ui->sPort->text().toInt());
    //新的链接
    connect(server,&QTcpServer::newConnection,this,[=]()
    {
        //接受客户端的套接字对象
        //sock_addr 结构体 == 类 QTcpScoket
        conn = server->nextPendingConnection();
        //发送数据 给客户端
        conn->write("小弟你好");
        ui->record->append("有新的连接...");

        //保证conn是一个有效的对象
        connect(conn,&QTcpSocket::readyRead,this,[=]()
        {
            //接收数据
            QByteArray array = conn->readAll();
            ui->record->append(array);
        });

    });
    //发送
    connect(ui->send,&QPushButton::clicked,this,[=]()
    {
        //发送数据
        conn->write(ui->msg->toPlainText().toUtf8());//转换格式成为utf8
        ui->record->append("Me Say" + ui->msg->toPlainText());//添加新内容
        ui->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

创建完成之后,有如下界面显示。
在这里插入图片描述
下一步创建客户端,首先在client.h添加头文件。

#include <QWidget>
#include <QTcpSocket>
  • 1
  • 2

并且在类中定义新的套接字。

private:
    Ui::Client *ui;
    QTcpSocket *client;
  • 1
  • 2
  • 3

在client.cpp中添加如下的代码。

#include <QHostAddress>
Client::Client(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
    ui->sIP->setText("127.0.0.1");//设置初始的IP地址
    ui->sPort->setText("9999");//设置初始的端口号
    //init
    client = new QTcpSocket(this);
    //连接服务器,参数包括主机的地址,主机的端口号。
    client->connectToHost(QHostAddress(ui->sIP->text()),ui->sPort->text().toInt());
    //接收数据
    connect(client,&QTcpSocket::readyRead,this,[=]()
    {
        QByteArray array = client->readAll();//返回值是一种QByteArray类型。
        ui->record->append(array);//把返回读取到的内容都添加到record中。
        connect(ui->send,&QPushButton::clicked,this,[=]()//槽函数,按键发送消息
        {
           client->write(ui->msg->toPlainText().toUtf8());
           ui->record->append("ME say:" + ui->msg->toPlainText());//record后面添加新发送的内容。
        });
    });
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

QT-UDP通信

通信原理:
在这里插入图片描述

复习

文件类
1 、 QFile file(name)
file.setFileName
readALL()/readLine; --atEnd()==true(末尾)。
int size = write(char* buf,int size)
2、 QTextStream ts(&f);
需要和文件设备一起使用,IO设备,或者使用ts.setDevice(&f);
readAll()/readLine()
ts<<“abcdef”;箭头朝向就是目标。把abcdef写入ts。
ts>>str;把ts写入str。
3、QDataStream ds(&f);
使用操作符读取文件。
读文件:
ds>>str>>number;
写文件:
char *str = “string”;
ds<<Qstring(“string”)<<1234;//隐式转换成QString
读文件:
QString str;
int number;
ds>> str >>number;

Qpixmap pix;
QByteArray array;
QDataStream ds(&array,QIODevice::WriteOnly);
ds<<pix;

5.TCP:包含的模块qmak += network
服务器端:
1.listen:QtcpServer --不是IO设备 父类是QObject //只是监听 ,不需要发送和接收数据
2.通信:QtcpSocket --父类是IO设备 --QIODevice
1>. 服务器端 等待连接
监听:server.listen(Any,port);
2>.newConnection();
1.接收请求 – 拿到client端的套接字的对象的地址
conn = server.nextPendingConnection(); //指针初始化
3>. write –
4>.read)—— readyRead

客户端:QTcpSocket cl;
cl.connectToHost(IP,port);

6.UDP类:QUdpSocket --IO设备
1.发送数据:s.writedatagram(data,对方的IP,对方的Port);
2.readyRead()
int size = s.pendingDatagramSize();
QByteArray array(size,0);
s.readDatagram(buf,size);
3.要接收数据:绑定一个端口号(本地)。
4.广播 : 255.255.255.255
5.组播:。。。
另一方需要接收组播消息:加入到组播地址。

多线程操作

起初创建的界面,模拟多线程。

在这里插入图片描述
添加如下代码:

mytimer = new QTimer(this);    connect(mytimer,&QTimer::timeout,this,[=]()
    {
            static int num =0;
           ui->lcdNumber->display(num++);
    });
  • 1
  • 2
  • 3
  • 4
  • 5
void MyWdiget::on_begin_clicked()
{
    if(mytimer->isActive() == true)
    {
        return;
    }
    //启动定时器
    mytimer->start(500);  //ms
    //复杂的操作
    QThread::sleep(5);//线程睡眠5ms
    //关闭定时器
    mytimer->stop();
    qDebug()<<"定时器已经停止了";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述
之后添加一个新的类,改变继承的参数。

数据库操作

首先添加sql模块。
添加头文件。

#include <QSqlDatabase>
#include <QDebug>
  • 1
  • 2

在widget.cpp添加新的数据库。

//添加一个数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("驱动名");
    qDebug()<<QSqlDatabase::drivers();

  • 1
  • 2
  • 3
  • 4

运行结果显示。
第一个是嵌入式的文本文件。
在这里插入图片描述
第一种风格的批量处理。

// 设置数据库
    db.setHostName("localhost");//设置主机的IP
    db.setUserName("root");//登录mysql数据库的用户名
    db.setPassword("1234");//登录mysql数据库的密码
    db.setDatabaseName("test");//登录哪一个数据库
    //打开数据库
    if(db.open()==false)
    {     QMessageBox::warning(this,"warning",db.lastError().text());
    }
    //增删查改
    //添加一条记录
    QSqlQuery query;
//    QString sql = "insert into people(name,age) values('张三丰',123)";
//    query.exec(sql);//执行
    //预处理
    // ?是 通配符  odbc风格的通配符
    query.prepare("insert into people(name,age) values(?,?)");
    //添加绑定数据
    QVariantList namelist;//一个链表
    namelist << "aa"<<"bb"<<"cc";
    query.addBindValue(namelist);
    QVariantList agelist;//一个链表
    namelist << 12<<13<<14;
    query.addBindValue(agelist);
    //执行批处理
    query.execBatch();
  • 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

第二种风格的批量处理。

//oracle 风格的通配符
    //方式:  +自定义的名字
    query.prepare("insert into people(name,age) values(:name,:age)");
    //添加绑定数据
    QVariantList namelist;//一个链表
    namelist << "aa"<<"bb"<<"cc";
    query.bindValue(":name",namelist);
    
    QVariantList agelist;//一个链表
    namelist << 12<<13<<14;
    query.bindValue(":age",agelist);
    //执行批处理
    query.execBatch();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

数据库的查询
剩下的操作就是sql语句了。

  //数据查询
    query.exec("select * from people");//指针指向首地址
    //如果有值就查出来记录了,false是个空表
    while(query.next() == false)//遍历每一条记录      
    {
    qDebug()<<query.value(0).toInt() //0 表示 第一个字段的索引值
            <<query.value("name").toString().toUtf8().data();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
//1.实例化 model
    model = new QSqlTableModel(this);
    //2.将模型设置到模型中--前提是你已经打开了数据库
    ui->tableView->setModel(model);
    //3.给model设置数据库表
    model->setTable("");
    //4.查询表.//可以把表显示到界面上。
    model->select();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
//1.实例化 model
    model = new QSqlTableModel(this);
    //2.将模型设置到模型中--前提是你已经打开了数据库
    ui->tableView->setModel(model);
    //3.给model设置数据库表
    model->setTable("");
    //4.查询表.//可以把表显示到界面上。
    model->select();
    //5.设置表头
    model->setHeaderData(0,Qt::Horizontal,"编号");
    //6.设置提交模式,程序刷新不会更改
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);//用户提交操作
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

几个不同按钮的操作
提交

 //设置提交按钮
  model->submitAll();
  • 1
  • 2

撤销

//设置撤销按钮
    model->revertAll();
    model->submit();//撤销完成之后,再提交一边,作用是更新数据库。
  • 1
  • 2
  • 3

查询

QString name = ui->lineEdit->text();//查询人的名字
    //设置过滤条件
    QString sql = QString("name = %1").arg(name);
    model->setFilter(sql);
    //重新查询
    model->select();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

界面设计如下:
在这里插入图片描述

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

闽ICP备14008679号