QT(9.4)tcp通信,数据库,opencv,

这篇具有很好参考价值的文章主要介绍了QT(9.4)tcp通信,数据库,opencv,。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作业:

1.服务器

QT(9.4)tcp通信,数据库,opencv,,qt,tcp/ip,数据库,算法,c++,c语言,开发语言

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>//客户端头文件
#include <QMessageBox>//消息对话框头文件
#include <QTcpServer>//服务器头文件
#include <list> //链表头文件,用来存放客户端容器

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void newConnection_slot();//自定义处理newconnection信号的槽函数
    void readyRead_slot();//自定义处理readyRead信号的槽函数

    void on_startbtn_clicked();

private:
    Ui::Widget *ui;
    //定义服务器指针
    QTcpServer *server;
    //定义客户端指针链表容器
    QList<QTcpSocket *> clientList;
};
#endif // WIDGET_H

自定义函数:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //服务器实例化对象
    server = new QTcpServer(this);
}

Widget::~Widget()
{
    delete ui;
}



//自定义连接按钮对应的槽函数
void Widget::on_startbtn_clicked()
{
    //获取ui界面上的端口号,用无符号的16为整型
    quint16 port = ui->portEdit->text().toUInt();
    //将服务器设置成监听状态
    if(!server->listen(QHostAddress::Any,port))
    {
        //启动失败消息提示框
        QMessageBox::critical(this,"失败","服务器启动失败");
        return;
    }else
    {
        QMessageBox::information(this,"成功","服务器启动成功");
    }
    //此时服务器已经启动成功,将服务器设置成监听状态
    //当有客户端发来连接请求时,服务器就会发射一个newConnection信号
    //将该信号连接到对应的槽函数中处理相关逻辑
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);

}
//处理newConnected信号的槽函数
void Widget::newConnection_slot()
{
    //获取最新连接的客户端的套接字
    QTcpSocket *s = server->nextPendingConnection();
    //将获取的套接字存放到客户端容器中
    clientList.push_back(s);
    //如果该套接字有数据向服务器发送,那么套接字就会发射一个readyRead信号
    //我们可以将该信号连接到自定义的槽函数中
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);

}
//对readyRead信号对应的槽函数
void Widget::readyRead_slot()
{
    //遍历客户端容器中的所有客户端删除断开连接的客户端
    for(int i=0;i<clientList.count();i++)
    {
        if(clientList[i]->state()==0)
        {
            clientList.removeAt(i);//移除下标为i的客户端
        }
    }

    //遍历所有客户端,查看那个客户端发来数据
    for(int i=0;i<clientList.count();i++)
    {
        //判断如果第i个客户端有待读取的数据
        if(clientList[i]->bytesAvailable()!=0)
        {
            //读取相关数据
            QByteArray msg = clientList[i]->readAll();
            //展示到ui界面上
            ui->msgList->addItem(QString::fromLocal8Bit(msg));
            //将接收到的消息发送给所有客户端
            for(int j=0;j<clientList.count();j++)
            {
                clientList[j]->write(msg);
            }
        }
    }
}

客户端:

QT(9.4)tcp通信,数据库,opencv,,qt,tcp/ip,数据库,算法,c++,c语言,开发语言

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket> //客户端头文件
#include <QMessageBox>//消息对话框类


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connectBtn_clicked();
    void connected_slot();//自定义处理connected信号的槽函数
    void readyRead_slot();//自定义处理readyRead信号的槽函数
    void on_sendBtn_clicked();

    void on_disConnectBtn_clicked();
    void disconnected_slot();//自定义处理disconnected信号的槽函数

private:
    Ui::Widget *ui;
    //定义一个客户端指针
    QTcpSocket *socket;
    QString userName; //用户名
};
#endif // WIDGET_H

自定义函数:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //给客户端指针实例化空间
    socket = new QTcpSocket(this);
    //如果连接服务器成功,该客户端就会发射一个connected的信号
    //我们可以将该信号连接到自定义的槽函数中处理相关逻辑
    //由于该连接只需连接一次,所以,写在构造函数中即可
    connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);

    //客户端与服务器连接成功后,如果服务器客户端发来数据,那么客户端就会
    //我们可以将该信号连接到自定义的槽函数中处理相关逻辑
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    //当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected信号
    //我们可以将该与自定义槽函数连接
    //由于只需要连接一次,所以将该连接写到构造函数中
    connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);


}

Widget::~Widget()
{
    delete ui;
}

//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{
    //获取ui界面的信息
    userName = ui->userNameEdit->text();//获取用户名
    QString hostName = ui->ipEdit->text(); // 获取主机地址
    quint16 port = ui->portEdit->text().toUInt();//获取端口号

    //调用函数连接到主机
    //函数原型:virtual void connectToHost(const QString &hostName, quint16 port)
    //参数1:服务器的主机地址
    //参数2:端口号
    //返回值:无
    socket->connectToHost(hostName,port);
    //如果连接服务器成功,该客户端就会发射一个connected的信号
    //我们可以将该信号连接到自定义的槽函数中处理相关逻辑
    //由于该连接只需连接一次,所以,写在构造函数中即可

}
//关于处理connected信号的槽函数的定义
void Widget::connected_slot()
{
    QMessageBox::information(this,"成功","连接服务器成功");
    //向服务器发送一条消息,说:***:进入聊天室
    QString msg = userName + ":进入聊天室";
    socket->write(msg.toLocal8Bit());
}
//关于readyRead信号对应的槽函数的实现
void Widget::readyRead_slot()
{
    //读取该客户端中的数据
    QByteArray msg = socket->readAll();

    //将数据展示在ui界面
    ui->msgList->addItem(QString::fromLocal8Bit(msg));
}
//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{
    //获取Ui界面中的编辑的文本内容
    QString m = ui->msgEdit->text();
    //整合要发送的信息
    QString msg = userName + ":" + m;
    //将消息发送给服务器
    socket->write(msg.toLocal8Bit());
    //将消息编辑框中的内容清空
    ui->msgEdit->clear();
}
//断开按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{
    //准备要发送的信息
    QString msg = userName + ":离开聊天室";
    socket->write(msg.toLocal8Bit());
    //调用成员函数disconnectFromHost
    //函数原型:
    //功能:断开客户端与服务器的链接
    //参数:无
    //返回值:无
    socket->disconnectFromHost();
    //当客户端与服务器断开连接后,该客户端就会自动发射一个disconnected信号
    //我们可以将该与自定义槽函数连接
    //由于只需要连接一次,所以将该连接写到构造函数中
}
//disconnected信号对应的槽函数
void Widget::disconnected_slot()
{
    QMessageBox::information(this,"退出","断开成功");
}

QT(9.4)tcp通信,数据库,opencv,,qt,tcp/ip,数据库,算法,c++,c语言,开发语言文章来源地址https://www.toymoban.com/news/detail-706743.html

到了这里,关于QT(9.4)tcp通信,数据库,opencv,的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动

    如果需要在QT程序中实现与MySQL数据库的交互,那么必不可少的一环就是对Qt MySql数据库驱动的编译。 操作系统:Windows10 专业版 64位 Qt版本:Qt 5.15.2 开发环境Qt安装路径:D:Qt 交叉编译服务器:Ubuntu 18.4 交叉编译服务器Qt安装路径:/opt/Qt 目标芯片:rk3568 目标平台:arm64 Qt安装

    2024年02月11日
    浏览(69)
  • QT基础篇(13)QT5数据库

    1.数据库基本概念 数据库(Database)是指存储、管理和组织数据的集合。它是一个组织化的、可持久化的数据集合,用于支持数据的存储、检索、更新和管理。 数据库系统(Database System)是建立在计算机上的数据管理系统,由数据库、数据库管理系统(DBMS)和应用程序组成。

    2024年01月22日
    浏览(39)
  • Qt 无法连接MySQL数据库

    Qt 5.15及之后版本缺少mysql驱动:qsqlmysql.dll、qsqlmysqld.dll 下载对应版本驱动:https://github.com/thecodemonkey86/qt_mysql_driver/releases?page=2 拷贝至Qt安装路径下,例如 Qt5.15.25.15.2msvc2019_64pluginssqldrivers 根据mysql版本下载对应mysql压缩包https://downloads.mysql.com/archives/community/ 找到libmysql.dll、

    2024年04月12日
    浏览(55)
  • 九、Qt C++ 数据库开发

    《一、QT的前世今生》 《二、QT下载、安装及问题解决(windows系统)》 《三、Qt Creator使用》 ​​​ 《四、Qt 的第一个demo-CSDN博客》 《五、带登录窗体的demo》 《六、新建窗体时,几种窗体的区别》  《七、Qt 信号和槽》  《八、Qt C++ 毕业设计》 《九、Qt C++ 数据库开发》 《

    2024年01月18日
    浏览(52)
  • QT mysql 驱动-数据库安装以及qt连接ssl报错问题

    文章末尾是引用笔记 配置MySQL8.0 环境变量 如果不配置MySQL环境变量,就不能在命令行直接输入MySQL登录命令。下面说如何配置MySQL的环境变量: 步骤1:在桌面上右击【此电脑】图标,在弹出的快捷菜单中选择【属性】菜单命令。 步骤2:打开【系统】窗口,单击【高级系统设

    2024年01月20日
    浏览(49)
  • QT+SQLite数据库配置和使用

    一、简介 1.1 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 二、下载和配置 2.1 SQLite下载官网下载链接 2.2 根据计算机的配置,选择所需项目是64位还是32位下载对应的压

    2024年02月06日
    浏览(43)
  • Qt 数据库的注册和登录功能

    widget.h widget.cpp  client.h client.cpp  main函数 窗口设计部分 最终效果图:

    2024年02月07日
    浏览(44)
  • QT连接Mysql数据库(详细成功版)

    QT连接Mysql数据库步骤相对比较麻烦,因此写了篇文章将详细过程呈现给大家,欢迎大家来评论区指导提问。 示例代码: (1)在.pro文件中添加下列代码: (2)在mainwindow.h文件中添加下列头文件:  (3)在main.cpp文件中添加下列代码: 运行代码,如果连接Mysql成功则输出下面

    2024年01月16日
    浏览(46)
  • 数据库课程设计——工资管理系统Qt

    近年来,随着我国信息技术的飞速发展,计算机应用已逐渐渗透到各个领域。在企业管理领域内,计算机的应用已经十分广泛,各种管理机制与企业运作流程都与计算机紧密结合在一起,计算机的应用进一步完善了企业的管理,提高了企业的现代化管理形象。开发职工工资管理

    2024年02月04日
    浏览(46)
  • 5、QT中SQLite数据库的操作

    执行数据库操作的类: SQLite3的基础教程 ①、创建数据库的链接对象: ②、使用数据库驱动 ③、设置数据库的名称(创建一个数据库) ④、创建一张表 例子: 例子: ①、遍历所有数据并保存 ②、对比数据 例子: 查询数据的时候,必须要先把遍历的数据保存在sqlQuery类中

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包