QT作业5

news2024/11/19 8:24:33

1、聊天室

服务器端

//头文件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QListWidget>
#include <QMessageBox>
#include <QDebug>
#include <QLineEdit>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
    QListWidget *wid;
    QLineEdit *Edit;
    QPushButton *Btn;

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void on_clicked();
    void newConnect_slot();
    void readyRead_slot();

private:
    Ui::Widget *ui;
    QTcpServer *ser;
    QList<QTcpSocket*> cliList;
};
#endif // WIDGET_H


//源文件
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->wid=new QListWidget(this);
    wid->resize(800,500);
    wid->setFixedSize(760,400);
    wid->move(20,20);

    this->Edit=new QLineEdit(this);
    Edit->resize(500,50);
    Edit->move(20,440);
    this->Btn=new QPushButton("启动",this);
    Btn->resize(200,50);
    Btn->move(580,440);
    ser=new QTcpServer(this);
    QObject::connect(Btn,&QPushButton::clicked,this,&Widget::on_clicked);
}

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

void Widget::on_clicked()
{
    if(this->Btn->text()=="启动")
    {
        quint16 port=this->Edit->text().toUInt();

            if(ser->listen(QHostAddress::Any, port) == true)
            {
                QMessageBox::information(this, "成功", "服务器启动成功");
            }else
            {
                QMessageBox::information(this, "失败", "服务器启动失败");
            }


            connect(ser, &QTcpServer::newConnection, this, &Widget::newConnect_slot);




            //将文本内容更改成 关闭
            this->Btn->setText("关闭");
        }else
        {
            //关闭服务器
            ser->close();        //关闭监听


            //将文件内容更改成 启动
            this->Btn->setText("启动");
        }
}
void Widget::newConnect_slot()
{
    qDebug () <<"有新客户端发来连接请求了,请尽快处理";
    //获取最新连接的客户端套接字,并将最新连接的套接字地址返回
    QTcpSocket* socket = ser->nextPendingConnection();


    //将该客户端套接字放入到客户端容器中
    cliList.append(socket);


    //当有客户端向服务器发来数据时,当前这个客户端套接字就会自动发射一个readyRead信号
    //我们可以将该信号连接到对应的信号处理函数中,处理相关数据
    connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);


}
void Widget::readyRead_slot()
{
    //判断客户端容器中,是否有已经退出的客户端,或无效的客户端,如果有,将其进行移除
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->state() == QTcpSocket::UnconnectedState)
        {//功能:判断当前套接字的状态
           //参数:无
           //返回值:readyRead_slot表示无效的套接字
           cliList.removeAt(i);           //将下标为i的客户端套接字从容器中移除
        }
    }


    //再将客户端容器遍历一遍,判断哪个客户端中有数据待读
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->bytesAvailable() != 0)
        {
            //功能:获取当前套接字中待读数据的个数
            //参数:无
            //返回值:返回套接字中待读数据的个数,如果为0,表示没有数据可读
            //如果不等于0,表示有数据可读,可以使用readAll读取数据
            QByteArray msg = cliList[i]->readAll();


            //将该消息,展示到ui界面上
            this->wid->addItem(QString::fromLocal8Bit(msg));


            //将该消息转发给所有客户端
            for(int j=0; j<cliList.length(); j++)
            {
                if(i!=j)       
                {
                    cliList[j]->write(msg);
                }
            }
        }
    }
}

客户端

头文件:
#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 connnected_slot();
    void readyRead_slot();
    void disconnectes_slot();
    void on_pushButton_clicked();

    void on_connectBtn_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *cli;
    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);
    cli=new QTcpSocket(this);
    connect(cli,&QTcpSocket::connected,this,&Widget::connnected_slot);
    connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    connect(cli,&QTcpSocket::disconnected,this,&Widget::disconnectes_slot);
}

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


void Widget::connnected_slot()
{
    QMessageBox::information(this,"连接","连接成功!");
}


void Widget::readyRead_slot()
{
    //将客户端套接字中的消息读取出来
    QByteArray msg=cli->readAll();
    ui->listWidget->addItem(msg);
}
void Widget::disconnectes_slot()
{
    QMessageBox::information(this,"断开","断开服务器");
}

void Widget::on_pushButton_clicked()
{
    QString msg=ui->lineEdit->text();
    cli->write(msg.toLocal8Bit());
    ui->lineEdit->clear();
    QListWidgetItem *item=new QListWidgetItem(msg);
    item->setTextAlignment(Qt::AlignRight);
    ui->listWidget->addItem(item);
}

void Widget::on_connectBtn_clicked()
{
    if(ui->connectBtn->text()=="连接服务器")
    {
        userName = ui->userNameEdit->text();
        QString ip=ui->ipEdit->text();
        quint16 port =ui->portEdit->text().toUInt();
        cli->connectToHost(ip,port);

        ui->connectBtn->setText("断开服务器");
    }else {
        cli->disconnectFromHost();
        ui->connectBtn->setText("连接服务器");
    }
}

2、完善数据库管理系统

头文件:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QMessageBox>
#include <QDebug>
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_addBtn_clicked();

    void on_searchBtn_clicked();

private:
    Ui::Widget *ui;
    QSqlDatabase db;
};
#endif // WIDGET_H

源文件
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    if(!db.contains("mydb.db"))
    {
        db=QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("mydb.db");
    }
    if(!db.open())
    {
        QMessageBox::information(this,"失败","数据打开失败");
        return;
    }
    QString sql="create table if not exists Stu(numb int,name char,sex char,score double)";
    QSqlQuery query;
    if(!query.exec(sql))
    {
        QMessageBox::information(this,"提示","创建数据表失败");

        return;
    } else
        {
            QMessageBox::information(this,"提示","创建数据表成功");
            return;
        }
}

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

void Widget::on_addBtn_clicked()
{
    int ui_numb=ui->numbEdit->text().toUInt();
    QString ui_name=ui->nameEdit->text();
    QString ui_sex=ui->sexEdit->text();
    double ui_score=ui->scoreEdit->text().toDouble();
    if(ui_sex==NULL||ui_numb==0||ui_score==0||ui_name==NULL)
    {
        QMessageBox::information(this,"提示","请将信息填写完整");
        return;
    }else
    {

    }
    //准备sql语句
    QString sql=QString("insert into Stu values(%1,'%2','%3',%4)").arg(ui_numb).arg(ui_name).arg(ui_sex).arg(ui_score);
    QSqlQuery query;
    if(!query.exec(sql))
    {
        QMessageBox::information(this,"提示","创建数据表失败");

        return;
    }else
    {
        QMessageBox::information(this,"提示","创建数据表成功");
        return;
    }
}
//查找按钮对应的槽函数
void Widget::on_searchBtn_clicked()
{
    QString sql;
    if(ui->nameEdit->text()==NULL)
    {
        sql="select * from Stu";
    }else
    {
        sql=QString("select %1 from Stu").arg(ui->nameEdit->text());
    }
    QSqlQuery query;
    if(!query.exec(sql))
    {
        QMessageBox::information(this,"提示","查询失败");
        return;
    }

    int i=0;
    while(query.next())
    {
        //qDebug()<<query.record();
        for(int j=0;j<query.record().count();j++)
        {
            QTableWidgetItem *item=new QTableWidgetItem(query.record().value(j).toString());
            item->setTextAlignment(Qt::AlignCenter);
            ui->tableWidget->setItem(i,j,item);
        }
        i++;
    }
}

3、思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言(指针)4

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

我必须要吹一波MATLAB 2024a,太牛逼了!|福利:附安装教程及下载地址

最近逛MATLAB官网&#xff0c;发现MATLAB 2024a版本已经Pre-release了&#xff0c;翻了下release note&#xff0c;不得不感叹&#xff0c;实在是太强了&#xff01; 这次重点更新了四个工具箱&#xff1a; Computer Vision Toolbox Deep Learning Toolbox Instrument Contro…

1.基于python的单细胞数据预处理-降维可视化

目录 降维的背景PCAt-sneUMAP检查质量控制中的指标 参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 降维的背景 虽然特征选择已经减少了维数&#xff0c;但为了可视化&#xff0…

InputStream,OutputStream的用法以及相应的案例

1. 文件系统的操作&#xff1a;File类。 2. 文件内容的操作&#xff1a;Stream流。 字符流&#xff1a;IntputStream &#xff0c; OutputStream。 字节流&#xff1a;read &#xff0c; write。 InputStream&#xff0c;OutputStream InputStream和OutputStream都不能被实例…

Web数字孪生引擎

Web数字孪生引擎是指用于在Web上创建和运行数字孪生的软件平台。它们通常提供一组API和工具&#xff0c;用于连接到实时数据源、可视化数据并创建交互式体验。Web数字孪生引擎被广泛应用于各种应用&#xff0c;例如工业物联网、智能建筑、城市管理和公共安全等。北京木奇移动技…

Linux 安裝 rpm包

下载 地址&#xff1a;https://developer.aliyun.com/packageSearch 安装 rpm -ivh lsof-4.87-6.el7.x86_64.rpmlsof -Ki|awk {print $2}|sort|uniq -c|sort -nr|head lsof | wc -l

上位机图像处理和嵌入式模块部署(树莓派4b和电源供给)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说过pc电脑和嵌入式设备&#xff0c;两者都可以实现相同的软件功能。但是和pc相比较&#xff0c;嵌入式设备不仅价格更便宜&a…

RabbitMQ (windows) 安装

大家好我是苏麟 , 今天安装一下 RabbitMQ . 官网 : RabbitMQ: One broker to queue them all | RabbitMQ 1.点击 Getting Started 2. 点击 Docs 3.点击 Install And Upgrade 4.点击 installation via Chocolatory 5. 直接下载安装包 RabbitMQ 下好了先放在一遍 RabbitMQ 需要 E…

前端框架-echarts

Echarts 项目中要使用到echarts框架&#xff0c;从零开始在csdn上记笔记。 这是一个基础的代码&#xff0c;小白入门看一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" co…

新手做抖音小店必须了解的回款周期问题!这样做,一步快速结算

哈喽~我是电商月月 我们做抖音小店&#xff0c;在商品上架出单后&#xff0c;商家需要到商品的上家拍单&#xff0c;由上家发货给顾客&#xff0c;顾客收到货后&#xff0c;周期一到才能赚取到商品的差价&#xff0c;这个时间大概在7~15天之内&#xff0c;想准时发货不超时违规…

八款免费好用的3D建模AI工具,让你的设计更简单!

随着人工智能和大语言模型的不断发展&#xff0c;AI工具正逐渐渗透到3D建模领域中。传统上&#xff0c;3D建模师需使用如3ds Max、Maya等这类复杂的3D建模软件&#xff0c;投入大量的时间与精力来创作精细的模型。然而&#xff0c;有了AI工具的辅助&#xff0c;设计过程不仅对专…

激光测径仪在胶管生产中扮演着什么角色?

关键词&#xff1a;激光测径仪,胶管,胶管测径仪,在线测径仪 胶管生产的基本工序为混炼胶加工、帘布及帆布加工、胶管成型、硫化等。不同结构及不同骨架的胶管&#xff0c;其骨架层的加工方法及胶管成型设备各异。 全胶胶管因不含骨架层&#xff0c;只需使用压出机压出胶管即可&…

AWS云优化:实现性能和成本的最佳平衡

随着企业数字化转型的加速&#xff0c;对云计算平台的需求也不断增长。AWS作为云计算行业的领导者之一&#xff0c;提供了广泛的云服务和解决方案&#xff0c;帮助企业实现业务的创新和发展。在AWS云上部署应用程序和服务后&#xff0c;对其进行优化是至关重要的&#xff0c;以…

【官方下载】Android 开发环境之 java 11 下载地址和下载操作步骤

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我交流Android、微信小程序、鸿蒙项目。文章底部&#xff0c;csdn有为我插入微信的联络方式&#xff0c;欢迎大家联络我。 一&#x…

TikTok机房ip好还是住宅ip好?

住宅ip比较好&#xff0c;机房数据中心IP高效、低价&#xff0c;所以使用的人多且用处复杂&#xff0c;这类ip极大可能存在滥用的黑历史&#xff0c;通过此类ip访问tiktok&#xff0c;被禁止的可能性更高&#xff0c;更容易被拉入黑名单。所以我们推荐tiktok独享原生ip搭建节点…

计算机组成结构—指令和指令格式

目录 一、指令的基本格式 二、指令字长 1. 定长指令字结构 2.变长指令字结构 三、地址码 1.四地址指令 2.三地址指令 3.二地址指令 4.一地址指令 5. 零地址指令 四、操作码 1. 定长操作码指令格式 2. 扩展操作码指令格式 五、指令的操作数类型和操作类型 1. 操作…

openai 开源模型Whisper语音转文本模型下载使用

Whisper Whisper 是一种通用语音识别模型。它是在大量不同音频数据集上进行训练的,也是一个多任务模型,可以执行多语言语音识别、语音翻译和语言识别。官方地址 https://github.com/openai/whisper 方法 一个Transformer序列到序列模型被训练在多种语音处理任务上,包括多语…

mac 讨厌百度网盘怎么办

一、别拦我 首先请允许我泄个愤&#xff0c;tmd百度网盘下个1g的文件下载速度竟然超不过200k&#xff0c;只要不放在所有已打开软件的最前面&#xff0c;它就给你降到10k以内&#xff0c;关键是你慢就慢了&#xff0c;我也不是很着急&#xff0c;关键是你日常下载失败并且总是…

2024年滴滴前端一二三面(汽车资产管理)

面试前&#xff0c;先找面经哥&#xff0c;点击此处查看更多面经 一面 1、聊项目 2、实现 TypeScript 的 Await 3、手写 compose 4、用 Vue 或者 React 实现一个组件&#xff0c;组件通过 checkbox 控制列表传入数据每一列的全选反选 二面 1、项目问题以及实现细节 2、小程序…

跟TED演讲学英文:Why US politics is broken — and how to fix it by Andrew Yang

Why US politics is broken — and how to fix it Link: https://www.ted.com/talks/andrew_yang_why_us_politics_is_broken_and_how_to_fix_it? Speaker: Andrew Yang Date: April 2024 文章目录 Why US politics is broken — and how to fix itIntroductionVocabularyTr…