目录
网络聊天室服务器
网络聊天室客户端
学生管理系统
网络聊天室服务器
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//实例化一个tcp服务器
ser=new QTcpServer(this);
}
Widget::~Widget()
{
delete ui;
}
//启动按钮对应的槽函数
void Widget::on_startbtn_clicked()
{
if(ui->startbtn->text()=="启动"){
//获取ui界面上的端口号
//启动服务器
//将服务器设置为被动监听状态
if(ser->listen(QHostAddress::Any,ui->portEdit->text().toUInt())==true){
QMessageBox::information(this,"成功","服务器启动成功");
}
else{
QMessageBox::warning(this,"失败","服务器启动失败");
}
//当启动服务器后,如果有客户端发来连接请求,服务器会自动发射一个newConnection信号
//连接该信号到对应的信号处理槽函数
//可以放入到widget的构造函数中
connect(ser,&QTcpServer::newConnection,this,&Widget::new_Connect_slot);
//将文本内容更改为 关闭
ui->startbtn->setText("关闭");
}
else{
//关闭服务器
ser->close();
//将文本内容更改为启动
ui->startbtn->setText("启动");
}
}
//处理信号的槽函数实现
void Widget::new_Connect_slot()
{
//获取最新连接的客户端套接字
QTcpSocket *socket=ser->nextPendingConnection();
//将客户端信息存入容器
cliList.append(socket);
//当有客户端向服务器发来数据时,当前这个客户端套接字就会自动发射一个readyRead信号
connect(socket,&QTcpSocket::readyRead,this,&Widget::readRead_slot);
}
//关于readyRead信号对应的槽函数
void Widget::readRead_slot()
{
//判断客户端容器中是否有已经退出的客户端,有则删除
for(int i=0;i<cliList.size();i++){
//判断当前套接字的状态
if(cliList[i]->state()==QTcpSocket::UnconnectedState){
//无效删除
cliList.removeAt(i);
}
}
//再遍历客户端容器,判断哪个客户端有信息可读
for(int i=0;i<cliList.size();i++){
if(cliList[i]->bytesAvailable()!=0){
//获取当前套接字中待读数据个数,如果为0表示无数据
QByteArray msg=cliList[i]->readAll();
//将消息,展示到ui界面
ui->msgWidget->addItem(QString().fromLocal8Bit(msg));
//将该消息转发给其他客户端
for(int j=0;j<cliList.size();j++){
if(i!=j){
cliList[j]->write(msg);
}
}
}
}
}
网络聊天室客户端
#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::connected_slot);
//当客户端接收到服务器的消息,会自动发射一个readyread信号,将该信号连接到槽
connect(cli,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
connect(cli,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
Widget::~Widget()
{
delete ui;
}
//连接服务器的槽函数
void Widget::on_connectbtn_clicked()
{
if(ui->connectbtn->text()=="连接服务器"){
//执行连接服务器的工作,发送连接请求
cli->connectToHost(ui->ipedit->text(),ui->portedit->text().toUInt());
//当成功连接服务器后,当前客户端会自动发射一个connected的信号,连接到槽函数
//将按钮内容更换为断开服务器
ui->connectbtn->setText("断开服务器");
}
else{
//先向服务器发送一个要下线的消息
cli->write(QString("%1%2").arg(ui->useredit->text()).arg(":用户下线了").toLocal8Bit());
//断开服务器
cli->disconnectFromHost();
//当成功和客户端与服务器的连接断开时,客户端会自动发送disconnected信号
//将按钮内容更换为连接服务器
ui->connectbtn->setText("连接服务器");
}
}
//连接成功后槽函数
void Widget::connected_slot()
{
QMessageBox::information(this,"连接成功","连接服务器成功");
}
//信息发射按钮对应的槽函数
void Widget::on_sendbtn_clicked()
{
//将ui界面的消息发送给服务器
cli->write(QString("%1%2%3").arg(ui->useredit->text()).arg(":").arg(ui->msgedit->text()).toLocal8Bit());
//将消息显示在
QListWidgetItem *item=new QListWidgetItem(QString().fromLocal8Bit(ui->msgedit->text().toLocal8Bit()));
item->setTextAlignment(Qt::AlignRight);
ui->listWidget->addItem(item);
//清空消息框
ui->msgedit->clear();
}
//处理readyread信号对应的槽函数的实现
void Widget::readyRead_slot()
{
//将读取的信息存入到ui界面
ui->listWidget->addItem(QString().fromLocal8Bit(cli->readAll()));
}
//disconnected信号对应的槽函数
void Widget::disconnected_slot()
{
QMessageBox::information(this,"断开","断开服务器成功");
}
学生管理系统
#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::warning(this,"失败","数据库打开失败");
return;
}
//数据库打开成功操作数据库
//准备sql语句
QString sql="create table if not exists Stu(num int,name char,sex char,score double)";
//实例化一个sql执行者
//执行sql语句
if(!QSqlQuery().exec(sql)){
QMessageBox::warning(this,"失败","创建数据表失败");
}
}
Widget::~Widget()
{
delete ui;
}
//添加学员槽函数
void Widget::on_addbtn_clicked(){
QString sql=QString("insert into Stu values(%1,'%2','%3',%4);").arg(ui->numEdit->text()).arg(ui->nameEdit->text()).arg(ui->sexEdit->text()).arg(ui->scoreEdit->text());
if(ui->numEdit->text().size()==0 || ui->numEdit->text()==0||ui->sexEdit->text().size()==0||ui->scoreEdit->text()==0){
QMessageBox::warning(this,"失败","请将信息填写完整");
return;
}
if(!QSqlQuery().exec(sql)){
QMessageBox::warning(this,"失败","添加数据失败");
return;
}
else{
QMessageBox::information(this,"成功","添加数据成功");
return;
}
}
//查找对应的槽函数
void Widget::on_searchbtn_clicked()
{
//准备sql语句
QString sql;
if(ui->nameEdit->text()==NULL){
sql="select * from Stu";
}
else{
sql=QString("select * from Stu where name = '%1'").arg(ui->nameEdit->text());
}
QSqlQuery query;
if(!query.exec(sql)){
QMessageBox::warning(this,"失败","查询失败");
qDebug()<<query.lastError();
// ui->stutable->clear();
return;
}
//将查询结果插入ui界面
int i=0;
//默认查询结果在无效结果集
//next将结果集移动到有效结果集
int res;
do{
res=query.next();
// qDebug()<<res<<i;
if(res==false&&i==0){
// qDebug()<<res<<i;
ui->stutable->clearContents();
}
else if(res==false){
break;
}
for(int j=0;j<query.record().count();j++){
//将数据库中的数据依次存放到ui界面中
QTableWidgetItem *item=new QTableWidgetItem(query.record().value(j).toString());
item->setTextAlignment(Qt::AlignCenter);
ui->stutable->setItem(i,j,item);
}
i++;
}while(res);
}
//删除对应的槽函数
void Widget::on_delbtn_clicked()
{
//准备sql语句
QSqlQuery q;
if(!q.exec(QString("delete from Stu where name = '%1'").arg(ui->nameEdit->text()))){
QMessageBox::warning(this,"失败","删除失败");
return;
}
else{
QMessageBox::information(this,"成功","删除成功");
return;
}
}
//修改对应的槽函数
void Widget::on_changebtn_clicked()
{
QSqlQuery q;
if(!q.exec(QString("update Stu set num=%1,name='%2',sex='%3',score=%4 where name = '%2'").arg(ui->numEdit->text()).arg(ui->nameEdit->text()).arg(ui->sexEdit->text()).arg(ui->scoreEdit->text()))){
QMessageBox::warning(this,"失败","修改失败");
return;
}
else{
QMessageBox::information(this,"成功","修改成功");
return;
}
}