【0904作业】QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能

news2024/12/28 19:11:32

一、完成登陆界面跳转到聊天室

1> 项目结构

2> 源码

① .pro

②main

#include "mywnd.h"
#include"chatCli.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWnd w;
    w.show();

    Form f;
    QObject::connect(&w, &MyWnd::jump,&f,&Form::jump_slot);

    return a.exec();
}

③ mywnd.h

#ifndef MYWND_H
#define MYWND_H

#include <QWidget>
#include<QDebug>
#include<QString>
#include<QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MyWnd; }
QT_END_NAMESPACE

class MyWnd : public QWidget
{
    Q_OBJECT

signals:
    void jump();  //跳转界面的自定义信号函数   //jump是在头文件中自定义的信号函数

public slots:
    void login_slot();    //登陆界面的自定义的槽函数

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

private:
    Ui::MyWnd *ui;
};
#endif // MYWND_H

④ mywnd.cpp

#include "mywnd.h"
#include "ui_mywnd.h"

MyWnd::MyWnd(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWnd)
{
    ui->setupUi(this);

        //更改窗口标题
        this->setWindowTitle("MyQQ");

        //更改窗口图标
        this->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png"));

        //更改logo图
        ui->logoLab->setPixmap(QPixmap(":/icon/logo.png"));
        ui->logoLab->setScaledContents(true);                //设置内容自适应

        //更改 账号和密码lab
        ui->userNameLab->setPixmap(QPixmap(":/icon/userName.jpg"));
        ui->userNameLab->setScaledContents(true);
        ui->pwdLab->setPixmap(QPixmap(":/icon/passwd.jpg"));
        ui->pwdLab->setScaledContents(true);

        //设置账户和密码edit
        ui->userNameEdit->setPlaceholderText("QQ/邮箱/手机");
        ui->pwdEdit->setPlaceholderText("密码");
        ui->pwdEdit->setEchoMode(QLineEdit::Password);

        //对按钮设置图标
        ui->loginBtn->setIcon(QIcon(":/icon/login.png"));
        ui->cancelBtn->setIcon(QIcon(":/icon/cancel.png"));

        //将登录按钮连接到自定义的槽函数中
        connect(ui->loginBtn,&QPushButton::clicked,this,&MyWnd::login_slot);

        //将取消按钮连接到自定义的槽函数中
        connect(ui->cancelBtn,SIGNAL(pressed()),this,SLOT(close()));

}

MyWnd::~MyWnd()   //析构函数的定义
{
    delete ui;    //释放ui指针的内存
}

void MyWnd::login_slot()
{
    QString username = ui->userNameEdit->text();
    QString pwd = ui->pwdEdit->text();
    if(username == "admin" && pwd == "123456")
    {
        qDebug()<<"登录成功";
        QMessageBox box(QMessageBox::Information,"提示","登录成功",QMessageBox::Yes,this);
        int ret = box.exec();
        if(ret == QMessageBox::Yes)
        {
                emit jump();
                this->close();
        }
    }
    else
    {
        qDebug()<<"登录失败";
        //静态成员函数版本对话框实现,无需实例化对象,直接调用静态成员函数即可(函数名自带Icon)
        int ret = QMessageBox::question(this,"问题","账号密码不匹配,是否重新登录!?",         //对话框中文本内容
                                        QMessageBox::Yes|QMessageBox::No,   //提供的按钮
                                        QMessageBox::Yes);                  //默认选中的按钮
        //对用户点击的按钮进行判断
        if(ret == QMessageBox::Yes)
        {
            ui->pwdEdit->clear();  //清楚密码框内容
        }
        else
        {
            this->close();         //关闭本界面
        }
    }
}

⑤ charCli.h

#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();

public slots:
    void jump_slot();    //跳转界面的自定义的槽函数
    void on_connectBtn_clicked();
    void connected_slot();         //自定义处理connected信号的槽函数
    void readyRead_slot();         //自定义处理readyRead信号的槽函数
    void disconnected_slot();      //自定义处理disconnected信号的槽函数

    void on_disConnectBtn_clicked();
    void on_sendBtn_clicked();

private:
    Ui::Form *ui;
    QTcpSocket * socket;  //定义一个客户端指针
    QString username;         //将用户名设置为类中的私有成员,以便槽函数访问
};

#endif // FORM_H


⑥ charCli.cpp

#include "chatCli.h"
#include "ui_chatCli.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);

    //将发送区域的组件设置为不可用状态
    ui->sendBtn->setEnabled(false);
    ui->msgEdit->setEnabled(false);
    ui->disConnectBtn->setEnabled(false);

    //实例化客户端指针
    socket = new QTcpSocket(this);  //此刻就有一个客户端了
    //如果连接服务器成功,那么该客户端就会自动发射一个connected信号,我们可以将信号连接到槽函数中处理相关逻辑
    connect(socket,&QTcpSocket::connected,this,&Form::connected_slot);
    //如果服务器向客户端发送了数据,那么客户端会自动发起一个readyRead信号,我们可以将信号连接到槽函数中处理相关逻辑
    connect(socket,&QTcpSocket::readyRead,this,&Form::readyRead_slot);
    //如果成功断开与服务器的连接,那么该套接字就会自动发射一个disconnected的信号
    connect(socket,&QTcpSocket::disconnected,this,&Form::disconnected_slot);
}

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

void Form::jump_slot()
{
    this->show();
}

//连接服务器按钮对应的槽函数
void Form::on_connectBtn_clicked()
{
    //获取ui界面中的信息  connrctToHost参数1
    username = ui->userNameEdit->text();
    QString ip = ui->ipEdit->text();
    quint16 port = ui->portEidt->text().toUInt();
    //调用connectToHost函数连接服务器
    socket->connectToHost(ip,port);
    //如果连接服务器成功,那么该客户端就会自动发射一个connected信号,我们可以将信号连接到槽函数中处理相关逻辑
    //connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
}

//自定义处理connected信号的槽函数
void Form::connected_slot()
{
    //设置组件的可用状态
    ui->msgEdit->setEnabled(true);
    ui->sendBtn->setEnabled(true);
    ui->disConnectBtn->setEnabled(true);
    ui->userNameEdit->setEnabled(false);
    ui->ipEdit->setEnabled(false);
    ui->portEidt->setEnabled(false);
    ui->connectBtn->setEnabled(false);

    QString msg = username + ":已进入聊天室"; //准备数据发送给服务器
    socket->write(msg.toLocal8Bit());       //将数据写入socket套接字
}

//自定义处理readyRead信号的槽函数
void Form::readyRead_slot()
{
    QByteArray msg = socket->readAll();                 //读取所有套接字中的数据
    ui->msgList->addItem(QString::fromLocal8Bit(msg));  //将数据展示在ui界面
}

//自定义发送按钮的槽函数
void Form::on_sendBtn_clicked()
{
    QString m = ui->msgEdit->text();    //获取要发送的信息
    QString msg = username + ":" + m;  //整合要发送给服务器的数据
    socket->write(msg.toLocal8Bit());   //write的数据应该为QByteArray的,QString类型可以使用toLocal8Bit转换成QByteArray类型
    ui->msgEdit->clear();               //清空发送框的数据
}

//自定义断开服务器按钮的
void Form::on_disConnectBtn_clicked()
{
    QString msg = username + ":已离开聊天室";
    socket->write(msg.toLocal8Bit());
    socket->disconnectFromHost();
}

//自定义处理disconnected信号的槽函数
void Form::disconnected_slot()
{
    QMessageBox::information(this,"退出","退出聊天室");
    //设置组件的可用状态
    ui->msgEdit->setEnabled(false);
    ui->sendBtn->setEnabled(false);
    ui->disConnectBtn->setEnabled(false);
    ui->userNameEdit->setEnabled(true);
    ui->ipEdit->setEnabled(true);
    ui->portEidt->setEnabled(true);
    ui->connectBtn->setEnabled(true);
}

3> 效果展示

二、学生管理系统的查找和删除功能

//查找按钮对应的槽函数
void Widget::on_serachBtn_clicked()
{
    //清空信息
    ui->tableWidget->clear();

    //1、获取ui界面的信息(学号、姓名)
    int numb_ui = ui->numbEdit->text().toUInt();
    QString name_ui = ui->nameEdit->text();

    //2、判断是否有漏填数据
    if(numb_ui == 0 || name_ui.isEmpty())
    {
        QMessageBox::information(this,"提示","请将查询信息补充完整");
        return;
    }
    //3、准备sql语句
    QString sql = QString("select * from myTable WHERE numb = '%1' AND name = '%2'").arg(numb_ui).arg(name_ui);
    qDebug()<<sql;
    //4、实例化一个执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"失败","查找失败");
        return;
    }
//    if(!querry.next())
//    {
//        QMessageBox::information(this,"失败","查找失败,无匹配数据");
//        return;
//    }
    int i = 0;
    //5、遍历查找到的数据,并将数据填充到ui界面中
    while(querry.next())
    {
        for(int j = 0 ;j<querry.record().count()-1;j++)
        {
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));
        }
    }
}

//删除按钮对应的槽函数
void Widget::on_deleteBtn_clicked()
{
    //清空信息
    ui->tableWidget->clear();

    //1、从ui界面获取信息(学号、姓名)
    int numb_ui = ui->numbEdit->text().toUInt();
    QString name_ui = ui->nameEdit->text();
    //2、判断数据是否漏填
    if(numb_ui == 0 || name_ui.isEmpty())
    {
        QMessageBox::information(this,"提示","请将删除信息补充完整");
        return;
    }
    //3、准备sql语句
    QString sql = QString("delete from myTable WHERE numb = '%1' AND name = '%2'").arg(numb_ui).arg(name_ui);
    //4、实例化一个执行者
    QSqlQuery querry;
    if(!querry.exec(sql))
    {
        QMessageBox::information(this,"失败","删除失败");
        return;
    }
    else
    {
        QMessageBox::information(this,"成功","删除成功");
    }
}

1> 效果展示

 查找

  

删除

  

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

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

相关文章

【LeetCode算法系列题解】第51~55题

CONTENTS LeetCode 51. N 皇后&#xff08;困难&#xff09;LeetCode 52. N 皇后 II&#xff08;困难&#xff09;LeetCode 53. 最大子序和&#xff08;中等&#xff09;LeetCode 54. 螺旋矩阵&#xff08;中等&#xff09;LeetCode 55. 跳跃游戏&#xff08;中等&#xff09; …

【深入解析spring cloud gateway】07 自定义异常返回报文

Servlet的HttpResponse对象&#xff0c;返回响应报文&#xff0c;一般是这么写的&#xff0c;通过输出流直接就可以将返回报文输出。 OutputStream out response.getOutputStream(); out.write("输出的内容"); out.flush();在filter中如果发生异常&#xff08;例如…

如何使用GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。 2、数据可…

TypeScript_树结构-BST树

树结构 树的特点 树通常有一个根。连接着根的是树干树干到上面之后会进行分叉成树枝&#xff0c;树枝还会分又成更小的树枝在树枝的最后是叶子 树的抽象 树可以模拟生活中的很多场景&#xff0c;比如&#xff1a;公司组织架构、家谱、DOM Tree、电脑文件夹架构 优秀的哈希函…

神策数据 CJO 系列丨解密 CJO:连接体验的下一个前沿趋势

10 余年前&#xff0c;市场营销的焦点聚集在增长黑客如何利用 AARRR 模型&#xff08;获取 Acquisition、激活 Activation、留存 Retention、收入 Revenue、传播 Referral&#xff09;来推动并加速企业的生长发展。我们曾相信&#xff0c;在 AARRR 漏斗中&#xff0c;只要我们吸…

宝塔面板定时监控和重启MySQL数据库(计划任务)

往期教程 如果还有不了解宝塔面板怎么使用的小伙伴&#xff0c;可以看下我总结的系列教程&#xff0c;保证从新手变老鸟&#xff1a; 【建站流程科普】 个人和企业搭建网站基本流程及六个主要步骤常见的VPS主机运维面板汇总—网站运维面板云服务器&#xff0c;VPS&#xff0…

76 # koa 上下文的实现原理

上一节实现了 koa 基本逻辑实现以及属性的扩展&#xff0c;下面继续实现上下文的实现 ctx 跟 proto 的关系 ctx.__proto__.__proto__ protoMDN&#xff1a;defineGetter 备注&#xff1a; 此特性已弃用&#xff0c;建议使用对象初始化语法或 Object.defineProperty() API 来…

《职场情绪稳定:内在的力量与策略》

近期发生的新闻热点&#xff0c;如大规模裁员、创业公司倒闭、公共卫生事件等&#xff0c;让公众更加关注稳定情绪和心理健康的问题。在职场中&#xff0c;我们常常遇到各种挑战和压力&#xff0c;如何保持稳定的情绪成了一个重要的话题。 首先&#xff0c;让我们分享一些工作中…

RecyclerView的smooth scroller -- 诸多案例

作者&#xff1a;snwrking 最近碰到好几个使用LinearSmoothScroll(下方简称为LSS)的场景, 让我对这个类的了解更加进一步, 所以分享在这, 希望对有需要的同学有所帮助. 我个人不太喜欢太理论的东西, 所以整篇文章几乎全是我做过的案例, 也方便也有类似需求的同学对号入座地取用…

【用unity实现100个游戏之8】用Unity制作一个炸弹人游戏

文章目录 前言素材开始一、绘制地图二、玩家设置三、玩家移动四、玩家四方向动画运动切换 五、放置炸弹六、生成爆炸效果七、墙壁和可破坏障碍物的判断八、道具生成和效果九、玩家死亡十、简单的敌人AI十一、虚拟摇杆 待续源码完结 前言 我们将在这个视频中&#xff0c;学习如…

Oracle 遍历变量游标

背景 由于我们的数据库系统中的游标特别多&#xff0c;DBA让我们优化&#xff0c;减少游标的使用。 电脑系统&#xff1a;windows数据库&#xff1a;Oracle数据库图形化界面工具&#xff1a;Toad&#xff0c;DBeaver(我測試的時候用的)记录日期&#xff1a;2023-09-04 具体实…

macbookpro怎么删除软件没有鼠标

macbookpro怎么删除软件没有鼠标,macbookpro触摸板可以替代鼠标进行操作。左右键功能与鼠标相同&#xff0c;可用于执行删除操作。此外&#xff0c;还可以利用键盘上的Delete键来删除选中的文件。 删除软件方法 方法1、打开应用程序&#xff0c;键盘按住control&#xff0c;加点…

解决微信小程序recycle-view使用百分比单位控制宽高时出现的内容溢出问题

recycle-view是微信小程序官方推出的一个经过优化的长列表组件&#xff0c;但是在使用百分比单位控制高宽时有个内容溢出问题&#xff0c;虽然它提供了height和width的参数可以设置宽高&#xff0c;但每次写列表都需要去js里获取宽高并设置是较为麻烦的&#xff0c;所以现在来着…

Vue 3 基础(二)基础 1

API 参考 1、创建一个 Vue 应用 1.1 应用实例 每个 Vue 应用都是通过 createApp 函数创建一个新的 应用实例&#xff1a; import { createApp } from vueconst app createApp({/* 根组件选项 */ })1.2 根组件 我们传入 createApp 的对象实际上是一个组件&#xff0c;每个…

uni-app 之 图片

uni-app 之 图片 获取图片 v-bind 动态绑定 image.png <template><view><view>--- 获取图片1 ---<image src"../../static/img/tabbar_home1.png"></image></view><view>--- 获取图片2 v-bind 动态绑定---<image v-bi…

SolVES4.1学习1——安装与使用教程

1、下载并安装 SolVES 4版本是QGIS插件&#xff0c;但实际使用过程中发现在最新版的QGIS安装该插件过程中&#xff0c;会报错或异常。因此需安装特定版本的软件。共需安装如下图软件及Java环境等。 根据官方文档安装好后&#xff0c;可以进行相关操作。 2、设置QGIS环境 QG…

AutoSAR配置与实践(基础篇)3.7 BSW的WatchDog功能(下)

AutoSAR配置与实践(基础篇)3.7 BSW的WatchDog功能(下) BSW的WatchDog功能(下)一、WDG和其他模块交互BSW的WatchDog功能(下) ->返回总目录<- 一、WDG和其他模块交互 模块交互 看门狗模块由WdgM统一管理,这里围绕WdgM模块分析与其他模块交互。通过交互的说明,可以…

css画箭头图标放标题前面,旋转,border的单个边框设置

CSS边框属性_css border dotted_小张biubiu的博客-CSDN博客 你还不知道css的旋转效果怎么实现&#xff1f;来这里看看吧_css旋转效果_我糖呢的博客-CSDN博客 .sub-title{position: relative;margin-left: 59px;& span{color: #1CDBFE;};& span::before{content: "…

MyBatis-Plus深入 —— 条件构造器与插件管理

前言 在前面的文章中&#xff0c;荔枝梳理了一个MyBatis-Plus的基本使用、配置和通用Service接口&#xff0c;我们发现在MyBatis-Plus的辅助增强下我们不再需要通过配置xml文件中的sql语句来实现基本的sql操作了&#xff0c;不愧是最佳搭档&#xff01;在这篇文章中&#xff0c…