QT作业5

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、思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件验收计划书-验收规程(Word原件)

编写软件验收计划是软件开发过程中的一个关键步骤&#xff0c;其重要性体现在以下几个方面&#xff1a; 明确验收标准&#xff1a;软件验收计划详细列出了验收的标准、测试方法、测试环境等&#xff0c;确保所有相关人员对验收的期望和要求有清晰的认识。这有助于避免在验收阶段…

Electron+Vue+pyinstaller服务打包

electron环境安装略 1. electron的入口文件配置test.js, 需要在package.json 配置文件中指定main: src/test.js const { app, BrowserWindow } require(electron)const createWindow () > {const win new BrowserWindow({width: 800,height: 600})// win.loadFile(inde…

机器学习面试篇

如何理解机器学习数据集的概念 数据集是机器学习的基础&#xff0c;它包括了用于训练和测试模型所需的数据。数据集通常以矩阵的形式存在&#xff0c;其中每一行代表一个样本&#xff08;或实例&#xff09;&#xff0c;每一列代表一个特征&#xff08;或属性&#xff09;。…

浅谈C++ overload(重载) override(覆盖) overwrite(重写)

目录 1. 名词辨析2 含义解析1 overload重载2 override覆盖3 overwrite重写 3 区别4 代码示例 1. 名词辨析 关于这3个名词的中文翻译&#xff1a; overload翻译为重载&#xff0c;基本是没有歧义的&#xff1b;override和overwrite的翻译&#xff0c;我在参考了cppreference中…

文物藏品库房管理:守护珍贵文化遗产的宝库

一、引言 文物是人类文化遗产的珍贵财富&#xff0c;为了保护和传承科学有效的文物藏品库房管理是必不可少的。本文将介绍文物藏品库房管理的重要性&#xff0c;以及一些常用的管理方法和技术&#xff0c;提高文物保护工作的效果和水平以确保文物的安全与完整性。 二、文物藏品…

语音网关有哪些?

语音网关是一种网络设备&#xff0c;它使得通过传统的电话网络&#xff08;如公共交换电话网络&#xff0c;PSTN&#xff09;和现代的数据网络&#xff08;如互联网或私有数据网络&#xff09;进行的语音通信成为可能。语音网关的主要作用是在模拟或数字电话信号与数据网络的数…

C++ | Leetcode C++题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution { public:string addBinary(string a, string b) {string ans;reverse(a.begin(), a.end());reverse(b.begin(), b.end());int n max(a.size(), b.size()), carry 0;for (size_t i 0; i < n; i) {carry i < a.siz…

出海企业哪种组网方案更省事?

对于出海企业而言&#xff0c;建立跨地区的数据传输和协同工作至关重要&#xff0c;以提升运营效率。因此&#xff0c;网络构建变得迫在眉睫。通过构建企业组网&#xff0c;企业能够加强与海外分支、客户和合作伙伴之间的联系&#xff0c;加速海外业务的发展。 然而&#xff0c…

机器学习:基于K-近邻(KNN)、高斯贝叶斯(GaussianNB)、SVC、随机森林(RF)、梯度提升树(GBDT)预测葡萄酒质量

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

mac内存不足怎么清理?有哪些免费的软件工具?

当你的mac电脑使用一段时间之后&#xff0c;你可能就会发现&#xff0c;原本非常流畅的运行开始出现卡顿的现象&#xff0c;此时正是mac内存不足的外在表现。可mac内存不足怎么清理呢&#xff0c;别急&#xff0c;清理内存的方式方法有很多&#xff0c;小编将结合实际情况给大家…

字节跳动测试开发岗 3+1 面经+经验分享(收到offer,入职月薪27K)

现在&#xff0c;招聘黄金时间已经过了&#xff0c;在网上看了很多大佬的面经&#xff0c;也加了很多交流群&#xff0c;受到了很多朋友的提点&#xff0c;今天终于轮到我来分享面经啦&#xff0c;之前面试了几家公司&#xff0c;最后在八月初拿到了字节跳动测试岗的 offer&…

sql-labs(11-20)

1.less-11 1.判断类型 根据测试在使用 " 不会报错&#xff0c; 会报错&#xff0c;所以他是字符型的并且被单引号闭合&#xff0c;而且只有用户 登陆成功才会显示数据。所以先尝试报错注入 2.爆数据库 and updatexml(2,concat(0x7e,(select database()),0x7e),2)-- 3.爆数…

谷歌上架攻略:个人号20人连续14天封闭测试的详细流程及相关注意事项

众所周知&#xff0c;近年来&#xff0c;Google play为了确保应用质量和用户体验&#xff0c;对开发者提出不少新要求。其中&#xff0c;对于个人开发者的一项要求是&#xff0c;自2023年11月13日起&#xff0c;新注册的个人开发者账号在上架正式版应用前&#xff0c;必须经过2…

面试题:数组指针的创建和访问,取地址符号的使用//定义一个指向含有10个整型的数组的指针,如何通过这个指针访问数组?

下面哪个代码是错误的&#xff1f;&#xff08;&#xff09; #include <stdio.h> int main() {int* p NULL;int arr[10] { 0 };return 0; }A. p arr; B. int(*ptr)[10] &arr; C. p &arr[0]; D. p &arr; 上题答案选D&#xff0c;通过如下代…

Spring框架学习-详细

文章目录 1. Spring简介1.1 面向接口编程1.2 Spring简介1.3 Spring体系结构 2 Spring IoC - 基于XML2.1 Sping框架部署&#xff08;IoC&#xff09;2.2 Spring IoC使用2.3 IoC和DI2.4 DI依赖注入Spring容器通过反射方法实现属性注入有三种方式1. set方法注入2. 构造器注入 2.5 …

系统设计 —— 随用户扩展

单服务器设置&#xff1a; 在单服务器设置中&#xff0c;所有内容都运行在一台服务器上。这包括网页应用程序、数据库、缓存等。 1*HQXZgCc5Vh8KooJHwKfzjw.png 图1.1 请求流程 1.最终用户通过域名&#xff08;myurl.com&#xff09;访问网站。请求发送到 DNS&#xff0c;将域名…

Laravel框架使用图片处理简单教程

PHP图片处理扩展包使用 文中使用的是Laravel框架&#xff0c;更多框架扩展包请点击传送门-》更多框架集成 Intervention Image 是一个开源的 PHP 图像处理和操作 库。它提供了一个更简单也更优雅的方式来创建/编辑/组合图像,并且支持最常见的两个图像处理库 GD Library 和 Im…

solidworks的进阶操作

目录 1 可以找别人的图 2 渲染 2.1 基本流程 2.2 相机和光源 3 装配图缩放 3.1 将装配图转换为零件 3.2 删除一些细节(可选) 3.3 缩放 4 3dmax文件转换为STL并对STL上色 5 文件是未来版本 1 可以找别人的图 有时需要出一些示意图&#xff0c;像是电脑桌子…

【NodeMCU实时天气时钟温湿度项目 4】通过NTPClient库获取实时网络时间并显示在TFT屏幕上

今天是【实时天气时钟温湿度项目】第四专题&#xff0c;主要内容是&#xff1a;学习导入NTPClient库&#xff0c;通过这个库获取实时网络时间&#xff0c;显示在1.3寸TFT液晶屏幕上。此前三个专题&#xff0c;请选择查看以下链接。 第一专题内容&#xff0c;请参考 【N…

springboot2.x集成Elasticsearch7.7.0

一、前言 elasticsearch安装就不做过多介绍了&#xff0c;网上一搜一大堆&#xff1b;最需要注意的就是Elasticsearch与spring版本&#xff0c;防止版本不兼容导致的后续的一系列问题。我这里springbootspring-data-elasticsearch&#xff0c;他们的版本对照关系可以参照sprin…