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

news2025/1/21 18:50:27

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

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/996703.html

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

相关文章

Vue2+Vue3基础入门到实战项目(前接六 副线一)—— 面经 项目

day1 接口文档地址&#xff1a;https://www.apifox.cn/apidoc/project-934563/api-20384515 一、项目功能演示 1.目标 启动准备好的代码&#xff0c;演示移动端面经内容&#xff0c;明确功能模块 2.项目收获 二、项目创建目录初始化 vue-cli 建项目 1.安装脚手架 (已安装…

对Spring核心思想的理解(二)

Spring的第二大核心思想&#xff0c;面向切面编程。 官方定义是&#xff1a;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&#xff0c;是函数式编程的一种衍…

【大数据实训】用Hbase模拟电影搜索引擎(四)

博主介绍&#xff1a;✌全网粉丝6W,csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于大数据技术领域和毕业项目实战✌ &#x1f345;文末获取项目联系&#x1f345; 《云计算与大数据处理》课程大作业评分表 项目考核内…

python读取监控流通过websocket连接发送到java服务端,服务端推流到前端

python读取逐帧读取监控 import websocket import base64 import cv2 import numpy as npvideoPath "rtmp://ns8.indexforce.com/home/mystream" // 此为公开RTSP流def on_message(ws, message):print(1)def connection_tmp(ws):websocket.enableTrace(True)ws w…

时序分解 | MATLAB实现基于小波分解信号分解分量可视化

时序分解 | MATLAB实现基于小波分解信号分解分量可视化 目录 时序分解 | MATLAB实现基于小波分解信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于小波分解的分量可视化&#xff0c;MATLAB编程程序&#xff0c;用于将信号分解成不同尺度和频率的子信…

动态库的制作和使用

动态库和静态库的工作原理 配置环境变量 方式1&#xff1a; 坏处&#xff1a;环境变量是临时的 方式2&#xff1a; 1 用户级别的配置&#xff1a; 进入到/home&#xff0c;找到.bashrc&#xff0c;进入 先去找到库的路径 然后再到.bashrc最后一行输入路径 使其生效 2 系统…

芯片产业链补齐,中国成全球唯一拥有全部工业门类的国家

随着一款国产5G手机的发布&#xff0c;中国制造在芯片产业链方面也形成了自己的完整体系&#xff0c;成为全球唯一一个拥有全部工业门类的国家&#xff0c;这是非常值得高兴的消息。 中国早在2010年就成为全球最大制造国&#xff0c;不过当时中国制造所需要的芯片大多都需要从海…

解决img标签和p标签不能水平居中对齐的问题

现象如下&#xff1a; <div class"children"><div class"wrap"><ul><li class"product"><a href"#"><img src"./images/miphone1.jpg"><p>小米手机</p></a></li&…

【LeetCode-中等题】27. 移除元素

文章目录 题目方法一&#xff1a;快慢指针 题目 方法一&#xff1a;快慢指针 int fast 0;// 快指针 用于扫描需要的元素int slow 0;//慢指针 用于记录需要存放元素的位置class Solution { // 快慢指针public int removeElement(int[] nums, int val) {int fast 0;// 快指针…

页面分布引导新手指引(driver.js)

页面分布引导&#xff08;driver.js&#xff09; 最近由于有一个需求——做新手指引&#xff0c;在新用户进入页面的时候提供指引和帮助,快速让用户熟悉页面的功能,但是为了不要过多影响现有的页面逻辑和样式,找到一款非常好用的工具driver.js:Driver.js是一个功能强大且高度可…

golang-bufio 缓冲扫描

前面两篇博客&#xff0c;介绍了 bufio 包中的缓冲读和写&#xff08;bufio.go&#xff09;&#xff0c;下面再来介绍一下缓冲扫描&#xff08;scan.go&#xff09;。这个扫描的是用来对缓存读的更高级封装&#xff0c;提供了一些更易用的方法。 缓冲扫描 Scanner 提供了一个…

电子技术基础(三)__第2章放大电路原理__英文简称

静态分析&#xff0c; 又称为直流分析&#xff0c; 用于求出电路的直流工作状态&#xff0c; 即l输入信号 。 一 . 先看几个英文符号 : 集电极及发射极间电压, 简称管压降 : 发射结电压降&#xff0c; 二. 接着看 加上Q点的英文简称 Q点: 放大电路的静态工作点&#…

【Spring面试】二、BeanFactory与IoC容器的加载

文章目录 Q1、BeanFactory的作用是什么&#xff1f;Q2、BeanDefinition的作用是什么&#xff1f;Q3、BeanFactory和ApplicationContext有什么区别&#xff1f;Q4、BeanFactory和FactoryBean有什么区别&#xff1f;Q5、说下Spring IoC容器的加载过程&#xff08;※&#xff09;Q…

《向量数据库》——向量数据库的使用场景有哪些?

向量数据库在许多应用领域都有广泛的用途,特别是那些需要存储、检索和分析向量数据的场景。以下是一些常见的向量数据库使用场景: 1、相似性搜索: 推荐系统:用于根据用户的历史行为或兴趣,搜索相似用户或物品,以提供个性化推荐。图像检索:允许用户通过图像查询相似的图像…

Leangoo领歌 -敏捷任务管理软件,任务管理更轻松更透明

​任务管理&#xff0c;简单易懂&#xff0c;就是对任务进行管理。那怎么可以更好进行任务管理呢&#xff1f;怎么样样可以让任务进度可视化&#xff0c;一目了然呢&#xff1f;有效的管理可以让我们事半功倍。 接下来我们看一下如何借助任务管理软件高效的做任务管理。 首先…

机器学习实战-系列教程6:SVM分类实战1(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、原理解读、代码解读

&#x1f308;&#x1f308;&#x1f308;机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1 SVM分类实战2 支持向量机&#xff08;Support Vector Machines&#xff0c;SVM&#xff09;&#xff0c;用于分类和…

开箱报告,Simulink Toolbox库模块使用指南(六)——S-Fuction模块(TLC)

文章目录 前言 Target Language Compiler&#xff08;TLC&#xff09; C MEX S-Function模块 编写TLC文件 生成代码 Tips 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 见《开箱报告&am…

Unity中Shader抓取屏幕并实现扭曲效果实现

文章目录 前言一、屏幕抓取&#xff0c;在上一篇文章已经写了二、实现抓取后的屏幕扭曲实现思路&#xff1a;1、屏幕扭曲要借助传入 UV 贴图进行扭曲2、传入贴图后在顶点着色器的输入参数处&#xff0c;传入一个 float2 uv : TEXCOORD&#xff0c;用于之后对扭曲贴图进行采样3、…

【鲁棒电力系统状态估计】基于投影统计的电力系统状态估计的鲁棒GM估计器(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Orangepi Zero2 全志H616(一):配置初始化和启动流程

目录 一&#xff0c;Orangepi简单说明 ①为什么使用全志H616 ②基本特性 ③配套操作系统支持 二&#xff0c;刷机和系统启动 ①准备工具 ②登录系统 ● 开发板供电 ● 登录 ● 开发板上板载LED灯测试说明 ③修改登录密码 ④网络配置 ⑤SSH登陆开发板 三&#xff…