• QT 自学内容 day04 UDP 数据传输, TCP 数据传输,ui 界面设计,按钮的设计自动绑定槽函数!


    1.首先是UDP 数据传输,

    DP 的客户端

    1.我们在自定义的类里面 定义 套接字,和时间定时器

    QUdpSocket *m_udp;

    QTimer *m_pTimer;

    头文件:

    #include //套接字

    #include //时间定时器

    2.在构造函数的时候我们 初始化数据  

    1. m_udp = new QUdpSocket;//创建udp套接字
    2. m_pTimer = new QTimer;//创建定时器
    3. m_pTimer->setInterval(1000);//时间间隔1s。
    4. connect(m_pTimer,&QTimer::timeout,this,&udpclient::writedata);//每隔1s,发送数据,并且触发槽函数
    5. m_pTimer->start();//启动定时器

    3.在析构函数的时候我们释放 数据

    1. delete m_udp;
    2. delete m_pTimer;

    4.写槽函数

    1. //发送数据报。
    2. void udpclient::writedata()
    3. {
    4. QByteArray data = "hello";
    5. m_udp->writeDatagram(data,data.size(),QHostAddress("191.161.110.1"),10001);//这里是自己主机的ip 和端口号
    6. }

    客户端的所有的代码:

    udpclicent.h

    1. #ifndef UDPCLIENT_H
    2. #define UDPCLIENT_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. class udpclient : public QObject
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit udpclient(QObject *parent = 0);
    13. ~udpclient();
    14. signals:
    15. public slots:
    16. void writedata();
    17. private:
    18. QUdpSocket *m_udp;
    19. QTimer *m_pTimer;
    20. };
    21. #endif // UDPCLIENT_H

    mian.cpp

    1. #include
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QCoreApplication a(argc, argv);
    6. udpclient *client = new udpclient();
    7. return a.exec();
    8. }

    udpclient.cpp

    1. #include "udpclient.h"
    2. #include <QByteArray>
    3. udpclient::udpclient(QObject *parent) : QObject(parent)
    4. {
    5. m_udp = new QUdpSocket;//创建udp套接字
    6. m_pTimer = new QTimer;//创建定时器
    7. m_pTimer->setInterval(1000);//时间间隔1s。
    8. connect(m_pTimer,&QTimer::timeout,this,&udpclient::writedata);//每隔1s,发送数据
    9. m_pTimer->start();//启动定时器
    10. }
    11. udpclient::~udpclient()
    12. {
    13. delete m_udp;
    14. delete m_pTimer;
    15. }
    16. //发送数据报。
    17. void udpclient::writedata()
    18. {
    19. QByteArray data = "hello";
    20. m_udp->writeDatagram(data,data.size(),QHostAddress("192.168.150.1"),10001);//这里是自己主机的ip 和端口号
    21. }

    2.UDP  的服务器数据的接收

    1.我们在自定义的类里面 定义 套接字

    QUdpSocket *m_udp;

    头文件:

    #include //套接字

    2.在构造函数的时候我们 初始化数据  

    1. //创建套接字
    2. m_udp = new QUdpSocket();
    3. //服务器绑定电脑ip或端口
    4. m_udp->bind(QHostAddress("192.168.150.1"),10001);
    5. //接收数据
    6. connect(m_udp,&QUdpSocket::readyRead,this,&udpsever::recvdat);//套接字的接收函数,来触发自定义的显示函数

    3.析构函数我们,关闭套接字

    delete m_udp;

    4.自定义的槽函数

    1. void udpsever::recvdat()
    2. {
    3. QByteArray pa;
    4. if(m_udp->hasPendingDatagrams())//首先判断是否读到数据报。
    5. {
    6. pa.resize(m_udp->pendingDatagramSize());//设置字符数组的大小。
    7. m_udp->readDatagram(pa.data(),pa.size());//udp套接字读取数据报
    8. //打印pa的数据
    9. qDebug() << pa.data() << endl;
    10. }
    11. }

    5.UDP所有的代码:

    udpsever.h

    1. #ifndef UDPSEVER_H
    2. #define UDPSEVER_H
    3. #include
    4. #include
    5. class udpsever : public QObject
    6. {
    7. Q_OBJECT
    8. public:
    9. explicit udpsever(QObject *parent = 0);
    10. ~udpsever();
    11. signals:
    12. public slots:
    13. void recvdat();
    14. private:
    15. QUdpSocket *m_udp;
    16. };
    17. #endif // UDPSEVER_H

    main.cpp

    1. #include
    2. #include "udpsever.h"
    3. int main(int argc, char *argv[])
    4. {
    5. QCoreApplication a(argc, argv);
    6. udpsever *server = new udpsever;
    7. return a.exec();
    8. }

    udpsever.cpp

    1. #include "udpsever.h"
    2. #include <QDebug>
    3. #include <QByteArray>
    4. udpsever::udpsever(QObject *parent) : QObject(parent)
    5. {
    6. //创建套接字
    7. m_udp = new QUdpSocket();
    8. //服务器绑定电脑ip或端口
    9. m_udp->bind(QHostAddress("192.168.150.1"),10001);
    10. //接收数据
    11. connect(m_udp,&QUdpSocket::readyRead,this,&udpsever::recvdat);
    12. }
    13. udpsever::~udpsever()
    14. {
    15. delete m_udp;
    16. }
    17. void udpsever::recvdat()
    18. {
    19. QByteArray pa;
    20. if(m_udp->hasPendingDatagrams())//首先判断是否读到数据报。
    21. {
    22. pa.resize(m_udp->pendingDatagramSize());//设置字符数组的大小。
    23. m_udp->readDatagram(pa.data(),pa.size());//udp套接字读取数据报
    24. //打印pa的数据
    25. qDebug() << pa.data() << endl;
    26. }
    27. }

    6.UDP  总结:
    客户端部分:只要初始化套接字,然后利用函数writeDatagram 发送信息。

    服务器部分: 初始化套接字,绑定IP  和端口,  然后利用函数QUdpSocket::readyRead() 函数来判定是否有数据传输,激活槽函数输出数据。


    7.TCP 数据的传输,

    TCP 客户端的规则:

    1.首先要规划号,连接的界面,ui->图片

    2.类里面添加成员   QTcpSocket *m_tcp;//TCP 成员

     


     8. 构造函数的初始化数据

    1. m_tcp = new QTcpSocket(this);
    2. connect(m_tcp,&QTcpSocket::connected,this,&Widget::connect_slot);//连接成功,显示提示信息
    3. connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);//当有readyRead信号时,客户端即可接收服务器数据。
    4. //PushButton 是直接在ui设计界面定义槽函数,没有在这里使用 connect 连接

    9.客户端的所有代码:

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. namespace Ui {
    6. class Widget;
    7. }
    8. class Widget : public QWidget
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit Widget(QWidget *parent = 0);
    13. ~Widget();
    14. private slots:
    15. void on_connect_clicked();
    16. void connect_slot();
    17. void readdata();
    18. void on_disconnect_clicked();
    19. void on_send_clicked();
    20. private:
    21. Ui::Widget *ui;
    22. QTcpSocket *m_tcp;
    23. };
    24. #endif // WIDGET_H

    main.cpp

    1. #include "widget.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Widget w;
    7. w.show();
    8. return a.exec();
    9. }

    widget.cpp

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include <QHostAddress>
    4. //1.创建TCP套接字对象
    5. //2.连接服务器
    6. //3.和服务器进行通讯
    7. //4.断开连接。
    8. Widget::Widget(QWidget *parent) :
    9. QWidget(parent),
    10. ui(new Ui::Widget)
    11. {
    12. ui->setupUi(this);
    13. //1.创建TCP套接字对象
    14. m_tcp = new QTcpSocket(this);
    15. connect(m_tcp,&QTcpSocket::connected,this,&Widget::connect_slot);//连接成功,显示提示信息
    16. connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);//当有readyRead信号时,客户端即可接收服务器数据。
    17. }
    18. Widget::~Widget()
    19. {
    20. delete ui;
    21. }
    22. //2.连接服务器
    23. void Widget::on_connect_clicked()
    24. {
    25. QString ip = ui->ip->text();//IP
    26. unsigned short port = ui->port->text().toShort();//端口
    27. m_tcp->connectToHost(QHostAddress(ip),port);//客户端连接服务器
    28. ui->connect->setEnabled(false);//连接按钮失能 //就是这是由连接按钮是否还能被使用,命令使用过后,这个按键不能被使用了
    29. ui->disconnect->setEnabled(true);//断开按钮使能 //就是这是由断开按钮是否还能被使用,命令使用过后,这个按键能使用了
    30. ui->textBrowser->append("已经连接服务器ip:"+ip);
    31. }
    32. void Widget::connect_slot()
    33. {
    34. ui->textBrowser->append("连接上服务器了");
    35. }
    36. void Widget::readdata()
    37. {
    38. QString data = m_tcp->readAll();
    39. ui->textBrowser->append(QString("服务器说:") + data);
    40. }
    41. void Widget::on_disconnect_clicked()
    42. {
    43. ui->textBrowser->append(QString("断开服务器了。。。"));
    44. m_tcp->close();
    45. ui->connect->setEnabled(true); //就是这是由连接按钮是否还能被使用,命令使用过后,这个按键能使用了
    46. ui->disconnect->setEnabled(false);//就是这是由断开按钮是否还能被使用,命令使用过后,这个按键不能使用了 。
    47. }
    48. void Widget::on_send_clicked()
    49. {
    50. QString data = ui->textEdit->toPlainText();
    51. m_tcp->write(data.toUtf8());//客户端向服务器发送数据
    52. ui->textBrowser->append(QString("客户端说:") + data);//显示记录
    53. ui->textEdit->clear();//清空发送文本框。
    54. }

    10.TCP服务器的数据传输。

    1.首先做好界面 ,ui -> 图片

    2.做好类里面的成员对象的定义

    头文件

    #include

    #include

    成员:

    QTcpServer *m_sever;//TCP服务器

    QTcpSocket *m_tcp;//TCP的套接字

    ui - >图片:


     11.TCP服务器的所有代码:

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. namespace Ui {
    7. class Widget;
    8. }
    9. class Widget : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. explicit Widget(QWidget *parent = 0);
    14. ~Widget();
    15. private slots:
    16. void on_pushButton_clicked();
    17. void newclient();
    18. void readdata();
    19. void on_pushButton_2_clicked();
    20. void clientdisconnect();
    21. private:
    22. Ui::Widget *ui;
    23. QTcpServer *m_sever;//TCP服务器
    24. QTcpSocket *m_tcp;//TCP的套接字
    25. };
    26. #endif // WIDGET_H

    main.cpp

    1. #include "widget.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Widget w;
    7. w.show();
    8. return a.exec();
    9. }

    widget.cpp

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include<QDebug>
    4. Widget::Widget(QWidget *parent) :
    5. QWidget(parent),
    6. ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. //第一步,创建TCP服务器m_server对象
    10. m_sever = new QTcpServer(this);
    11. }
    12. Widget::~Widget()
    13. {
    14. delete ui;
    15. }
    16. void Widget::on_pushButton_clicked()
    17. {
    18. qDebug()<<"运行了 服务器的监听";
    19. //第二步:设置服务器监听
    20. //port保存要监听的端口
    21. unsigned short port = ui->lineEdit->text().toShort();
    22. //监听本电脑的所有ip地址和port端口。
    23. m_sever->listen(QHostAddress::Any,port);
    24. //第三步:响应客户端的连接
    25. connect(m_sever,&QTcpServer::newConnection,this,&Widget::newclient);
    26. }
    27. void Widget::newclient()
    28. {
    29. //第四步:通过nextpendingconnection函数,获取服务端的socket对象。
    30. ui->textBrowser->append("客户端连接上了...");
    31. //m_tcp是服务器m_sever的子对象,当tcpsever对象被销毁的时候,它也会自动销毁。
    32. //但最好显示删除,避免浪费内存。注意无法从另一个线程使用返回的QTcpSocket对象。
    33. //如果希望使用来自另一个线程的传入连接,需要重写incoming connection()。
    34. m_tcp = m_sever->nextPendingConnection();
    35. //第五步:数据的接收
    36. connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);
    37. connect(m_tcp,&QTcpSocket::disconnected,this,&Widget::clientdisconnect);
    38. }
    39. void Widget::readdata()
    40. {
    41. QString temp = m_tcp->readAll();//服务器套接字m_tcp接收的所有数据。
    42. if(!temp.isEmpty())
    43. {
    44. ui->textBrowser->append("客户端说:"+temp);
    45. }
    46. }
    47. void Widget::on_pushButton_2_clicked()
    48. {
    49. //发送数据
    50. QString sendmsg = ui->textEdit->toPlainText();
    51. //服务器的套接字m_tcp发送数据。
    52. m_tcp->write(sendmsg.toUtf8());
    53. if(!sendmsg.isEmpty())
    54. {
    55. ui->textBrowser->append("服务器说:"+sendmsg);
    56. }
    57. //清空“发送数据框”
    58. ui->textEdit->clear();
    59. }
    60. void Widget::clientdisconnect()
    61. {
    62. //客户端断开了连接
    63. ui->textBrowser->append("客户端断开了连接....");
    64. //套接字m_tcp关闭
    65. m_tcp->close();
    66. }

    12.PushButton  怎么在ui 设计界面  设置槽函数!

    1.找到 PushButton  按键  右键   选择  转到槽

    2.选择的函数:

     


    13.ui  界面设置槽函数   在代码里面 槽函数的定义规则:

    查看QT帮助手册、编译生成该文件的原因是 文件中有该函数

    [static] void QMetaObject::connectSlotsByName(QObject *object)
    给出的说明:递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到以下形式的对象插槽:

    void on__();
    假设我们的对象有一个类型为QPushButton的子对象,对象名为button1。捕捉按钮的clicked()信号的槽是:

    void on_button1_clicked();
    如果对象本身具有正确设置的对象名称,则其自身的信号也将连接到其各自的插槽。

    综上所述,只要槽函数名规则是这样的:on_子对象名_信号名.


     

  • 相关阅读:
    计算机网络相关知识点总结(二)
    mysql主从复制实践
    如何用SQL语句创建数据库
    我和谷歌共成长-资深安卓开发的转型之路
    【sfu】network线程和主线程
    java游戏制作-飞翔的鸟游戏
    springboot项目整合swagger2
    VRJam 推出用于虚拟音乐会和现场直播的Web3场地
    LeetCode(力扣)53. 最大子数组和Python
    快手如何玩转复杂场景下的说话人识别?| ASRU 2021
  • 原文地址:https://blog.csdn.net/she666666/article/details/126903376