【0904作业】QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能
一、完成登陆界面跳转到聊天室
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_NAMESPACEclass MyWnd : public QWidget
{Q_OBJECTsignals: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); //设置内容自适应//更改 账号和密码labui->userNameLab->setPixmap(QPixmap(":/icon/userName.jpg"));ui->userNameLab->setScaledContents(true);ui->pwdLab->setPixmap(QPixmap(":/icon/passwd.jpg"));ui->pwdLab->setScaledContents(true);//设置账户和密码editui->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_OBJECTpublic: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参数1username = 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> 效果展示
查找
删除
相关文章:

【0904作业】QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能
一、完成登陆界面跳转到聊天室 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::co…...
ceph源码阅读 buffer
ceph::buffer是ceph非常底层的实现,负责管理ceph的内存。ceph::buffer的设计较为复杂,但本身没有任何内容,主要包含buffer::list、buffer::ptr、buffer::hash。这三个类都定义在src/include/buffer.h和src/common/http://buffer.cc中。 buffe…...

基本介绍——数据挖掘
1.数据挖掘的定义 数据挖掘是采用数学的、统计的、人工智能和神经网络等领域的科学方法,如记忆推理、聚类分析、关联分析、决策树、神经网络、基因算法等技术,从大量数据中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并…...
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
当使用 Navicat 连接 PostgreSQL 数据库时出现 ‘datlastsysoid does not exist’ 的错误报错,这可能是由于 Navicat 版本与 PostgreSQL 版本不兼容所致。 这是因为在较新的 PostgreSQL 版本中移除了 ‘datlastsysoid’ 列,但可能较旧版本的 Navicat 尚…...

冯诺依曼体系结构/什么是OS?
一、体系结构图 示意图 控制器可以控制其它4个硬件,四个硬件直接可以进行数据传输。 5大硬件 但是这些个体需要用“线”连接。 为什么要有存储器? 如果没有,实际速度则为输入、输出设备的速度。 加上后,变为内存的速度。&#…...
SD卡/TF卡简记
文章目录 MicroSD卡与SD卡关系与区别对比NM卡、XQD卡、CFexpress卡SD规格标识FAQ拍摄1080p或2k视频需要什么速度的sd卡?拍摄4k视频需要什么速度的sd卡?拍摄8k视频需要什么速度的sd卡? MicroSD卡与SD卡关系与区别 MicroSD卡原名为Trans-flash…...
Dockerfile COPY的奇怪行为:自动解包一级目录
记录一下今天遇到的坑:Dockerfile 这两天在部署项目的时候,新加进去了一个驱动,需要将2个文件夹以及1个文件COPY进镜像,大刀阔斧一个Dockerfile就写完了,结果COPY进去的文件有问题,Dockerfile的内容如下&am…...
【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举
一个图中连通三元组的最小度数【LC1761】 给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] [ui, vi] ,表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 三个 节点组成的集合且这三个点…...
前端日期减一天的笑话
vue日期减一天 给大家讲一个真实的笑话。最近做的一个项目,要统计不同年月日期的关联交易数量,由于和银行内数据对接取得数据都是T-1的,所以在首页根据日期统计一些交易数据量时默认是统计昨日的数据量。所以当时和前端约定好的让前端的妹子做…...

高效能,一键批量剪辑,AI智剪让创作更轻松
在今天的数字化时代,视频制作已经成为各种行业和领域的必备技能。然而,视频剪辑过程往往繁琐且耗时,大大降低了我们的工作效率。幸运的是,随着人工智能技术的发展,我们有了新的解决方案——AI智剪软件。 AI智剪软件&am…...

手写Mybatis:第15章-返回Insert操作自增索引值
文章目录 一、目标:Insert自增索引值二、设计:Insert自增索引值三、实现:Insert自增索引值3.1 工程结构3.2 Insert自增索引值类图3.3 修改执行器3.3.1 修改执行器接口3.3.2 抽象执行器基类 3.4 键值生成器3.4.1 键值生成器接口3.4.2 不用键值…...
【数据结构】动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释:
这段C代码实现了一个动态数组(vector)的基本操作,包括插入、删除、扩容、输出、释放内存等。以下是代码的解释和注释: // 引入标准输入输出库和标准库函数,用于后续的内存分配和打印输出等操作 #include <stdio.…...

[unity]三角形顶点顺序
序 详见官方文档:Unity - Manual: Mesh data (unity3d.com) Topology:拓扑结构 翻译: 拓扑描述网格具有的面类型。 网格的拓扑定义了索引缓冲区的结构,索引缓冲区又描述了顶点位置如何组合成面。每种类型的拓扑都使用索引数组中…...

【python爬虫】14.Scrapy框架讲解
文章目录 前言Scrapy是什么Scrapy的结构Scrapy的工作原理 Scrapy的用法明确目标与分析过程代码实现——创建项目代码实现——编辑爬虫代码实现——定义数据代码实操——设置代码实操——运行 复习 前言 前两关,我们学习了能提升爬虫速度的进阶知识——协程…...

功率放大器主要作用是什么呢
功率放大器是一种电子设备,主要作用是将输入信号的功率增加到更高的水平,以便能够驱动高功率负载。在许多应用中,信号源产生的信号往往具有较低的功率,无法直接满足一些要求较高的设备或系统的需求。而功率放大器则可以增强信号的…...
SpringBoot ApplicationEvent详解
ApplicationStartingEvent 阶段 LoggingApplicationListener#onApplicationStartingEvent 初始化日志工厂,LoggingSystemFactory接口,可以通过spring.factories进行定制 可以通过System.setProperty("org.springframework.boot.logging.LoggingSystem",&q…...
WebSocket 报java.io.IOException: 远程主机强迫关闭了一个现有的连接。
在客户端强制关闭时,或者窗口强制关闭时,后端session没有关闭。 有时还会报:java.io.EOFException: 这个异常 前端心跳没有收到信息,还在心跳。 CloseReason close new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, &…...

关于git约定式提交IDEA
背景 因为git提交的消息不规范导致被乱喷,所以领导统一规定了约定式提交 官话 约定式提交官网地址 约定式提交规范是一种基于提交信息的轻量级约定。 它提供了一组简单规则来创建清晰的提交历史; 这更有利于编写自动化工具。 通过在提交信息中描述功能…...

【计算机网络】http协议
目录 前言 认识URL URLEncode和URLDecode http协议格式 http方法 GET POST GET与POST的区别 http状态码 http常见header 简易的http服务器 前言 我们在序列化和反序列化这一章中,实现了一个网络版的计算器。这个里面设计到了对协议的分析与处…...
仓库太大,clone 后,git pull 老分支成功,最新分支失败
由于 git 仓库太大,新加入的小伙伴在拉取时,无法切换到最新的分支,报错如下: fetch-pack: unexpected disconnect while reading sideband packet fatal: early EOF fatal: fetch-pack: invalid index-pack output在此记录解决步…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...