1.网络编程
头文件
server
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QMessageBox>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
private slots:
void on_start_btn_clicked();
void newConnect_slot(void);
void readyRead_slot(void);
private:
Ui::MyWidget *ui;
QTcpServer* server;
QList<QTcpSocket*> client_list;//客户端连接链表
};
#endif // MYWIDGET_H
client
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
private slots:
void on_pushButton_2_clicked();
void connected_slot();
void readyRead_slot();
void disconnected_slot();
void on_pushButton_clicked();
private:
Ui::MyWidget *ui;
QTcpSocket* client;
QString username;
};
#endif // MYWIDGET_H
源文件
server
#include "mywidget.h"
#include "ui_mywidget.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
//1.给服务器指针初始化
server=new QTcpServer(this);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::on_start_btn_clicked()
{
if(ui->start_btn->text()=="启动")
{
//获取ui界面lineedit上的端口号
quint16 port=ui->port->text().toUInt();
//启动服务器
//2.将服务器设置成监听状态
if(server->listen(QHostAddress::Any,port)==true)//包括绑定
/*参数1:监听的ip地址,如果设置成Any,表示监听所有类型的主机地址,也可以指定特定的主机地址进行监听
参数2:端口号,若果设置成0,则让系统自动分配一个端口号,也可以指定特定的端口号*/
{
QMessageBox::information(this,"服务器启动信息框","服务器启动成功");
}
else
{
QMessageBox::information(this,"服务器启动信息框","服务器启动失败");
}
//启动服务器后,若有客户端连接服务器,则服务器会自动发送一个newConnection信号
connect(server,&QTcpServer::newConnection,this,&MyWidget::newConnect_slot);
//将文本内容改成关闭
ui->start_btn->setText("关闭");
}
else if (ui->start_btn->text()=="关闭")
{
//关闭服务器
server->close();
//将文本内容改成启动
ui->start_btn->setText("启动");
}
}
void MyWidget::newConnect_slot()
{
qDebug() << "有新客户端发来连接请求了,请尽快处理";
//获取最新连接客户端的套接字,并将最新连接的套接字地址返回
QTcpSocket* socket=server->nextPendingConnection();
//将客户端的套接字放入客户端容器中
client_list.append(socket);
//当有客户端向服务器发来数据时,当前这个客户端的套接字会自动发送一个readyRead信号
connect(socket,&QTcpSocket::readyRead,this,&MyWidget::readyRead_slot);
}
void MyWidget::readyRead_slot()
{
//判断客户端容器中,是否有已经退出的客户端(无效的客户端),若有,则移除
for(int i=0;i<client_list.length();i++)
{
//判断当前套接字的状态,无参,返回值UnconnectedState表示无效套接字
if(client_list[i]->state()==QTcpSocket::UnconnectedState)
{
client_list.removeAt(i);//将下标为i的客户端套接字从容器中移除
}
}
//判断客户端容器中,有哪个客户端套接字有待读数据
for(int i=0;i<client_list.length();i++)
{
//获取当前套接字中待读的数据 ,无参,返回待读数据的个数, 0 无数据可读 !0 有数据可读,用readAll读取
if(client_list[i]->bytesAvailable()!=0)
{
QByteArray msg=client_list[i]->readAll();
ui->mesWidget->addItem(QString::fromLocal8Bit(msg));//将消息展示在listWidget
client_list[i]->write(msg);
}
}
}
client
#include "mywidget.h"
#include "ui_mywidget.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
client=new QTcpSocket(this);
//将客户端的connected信号连接到到自定义的connected信号处理槽函数中
connect(client,&QTcpSocket::connected,this,&MyWidget::connected_slot);
//当客户端收到服务器的消息时,会自动发送一个readyRead信号,将其连接到自定义的readyRead信号处理槽函数
connect(client,&QTcpSocket::readyRead,this,&MyWidget::readyRead_slot);
//当客户端与服务器断开连接后会自动发送disconnected信号,将客户端的disconnected信号连接到自定义的disconnected信号处理槽函数中
connect(client,&QTcpSocket::disconnected,this,&MyWidget::disconnected_slot);
}
MyWidget::~MyWidget()
{
delete ui;
}
//连接服务器按钮的槽函数
void MyWidget::on_pushButton_2_clicked()
{
if(ui->pushButton_2->text()=="连接服务器")
{
//连接服务器
//获取ui界面的数据
username=ui->lineEdit_2->text();
QString ip=ui->lineEdit_3->text();
quint16 port=ui->lineEdit_4->text().toUInt();
//向服务器发送连接请求,参数1:ip地址,参数2:端口号
client->connectToHost(ip,port);
//
//将按钮文本改成断开服务器
ui->pushButton_2->setText("断开服务器");
}
else if(ui->pushButton_2->text()=="断开服务器")
{
//向服务器发送断开消息
QString msg=username+":离开聊天室";
client->write(msg.toLocal8Bit());
//执行断开服务器工作
client->disconnectFromHost();
//将按钮文本改成连接服务器
ui->pushButton_2->setText("连接服务器");
}
}
//处理connevted信号的槽函数
void MyWidget::connected_slot()
{
QMessageBox::information(this,"客户端连接框","客户端连接服务器成功");
}
//信息发送按钮的槽函数
void MyWidget::on_pushButton_clicked()
{
//1.获取ui界面上的文本信息
QString msg=username+":"+ui->lineEdit->text();
//2.客户端将信息发送给服务器
client->write(msg.toLocal8Bit());
//3.清空行编辑器中的内容
ui->lineEdit->clear();
//4.将消息展示在ui界面
QListWidgetItem* item=new QListWidgetItem(msg);
item->setTextAlignment(Qt::AlignRight);
ui->listWidget->addItem(item);
}
//处理readyRead信号的槽函数
void MyWidget::readyRead_slot()
{
//将客户端套接字中的消息读取出来
QByteArray msg=client->readAll();
//将读取的消息展示在ui界面上
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}
//处理disconnected信号的槽函数
void MyWidget::disconnected_slot()
{
QMessageBox::information(this,"客户端连接框","客户端断开连接");
}
2.数据库
头文件
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QtSql/QSqlDatabase>//数据库类
#include <QtSql/QSqlQuery>//sql语句执行类和数据表查询类
#include <QtSql/QSqlRecord>//数据表记录类
#include <QSqlError>
#include <QMessageBox>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
private slots:
void on_btn1_clicked();
void on_btn4_clicked();
void on_btn3_clicked();
void on_btn2_clicked();
private:
Ui::MyWidget *ui;
QSqlDatabase db;
};
#endif // MYWIDGET_H
源文件
#include "mywidget.h"
#include "ui_mywidget.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
/*--------------数据库的相关操作-----------------*/
/*----1.判断指定数据库是否存在,若不存在,则创建-----*/
/*----2.打开数据库------------------------------*/
//判断当前数据库操作对象中,是否包含了要处理的数据库
if(!db.contains("Stu.db"))
{
//添加一个数据库到当前的数据库对象中
db=QSqlDatabase::addDatabase("QSQLITE");
//给数据库设置名字
db.setDatabaseName("Stu.db");
}
//打开数据库
if(!db.open())//判断是否打开失败
{
QMessageBox::information(this,"数据库信息框","数据库打开失败");
return;
}
else
{
QMessageBox::information(this,"数据库信息框","数据库打开成功");
/*--------------创建数据表-----------------*/
//准备sql语句
QString sql="create table if not exists Stu(id int,name char,sex char,score double)";
QString sql1="create table if not exists Data(id int,name char,sex char,score double)";
//实例化一个sql语句执行者,执行sql语句
QSqlQuery query;
if(!query.exec(sql)||!query.exec(sql1))
{
QMessageBox::information(this,"数据表信息框","创建数据表失败");
return;
}
else
{
QMessageBox::information(this,"数据表信息框","创建数据表成功");
}
}
}
MyWidget::~MyWidget()
{
delete ui;
}
/*--------------添加学生信息槽函数-----------------*/
void MyWidget::on_btn1_clicked()
{
//获取ui界面上的信息
int ui_id=ui->id_le->text().toUInt();//toUInt 转换成int型数据
QString ui_name=ui->name_le->text();
QString ui_sex=ui->sex_le->text();
double ui_score=ui->score_le->text().toDouble();//toDouble 转换成double型数据
//判断是否有必填项未填
if(ui_sex==NULL || ui_id==0 || ui_score==0 || ui_name==NULL)
{
QMessageBox::information(this,"数据表信息框","请将信息填写完整");
return;
}
//准备sql语句
QString sql=QString("insert into Stu values(%1,'%2','%3',%4)").arg(ui_id).arg(ui_name).arg(ui_sex).arg(ui_score);
//实例化一个sql语句执行者,执行sql语句
QSqlQuery query;
if(!query.exec(sql))
{
QMessageBox::information(this,"数据表信息框","添加数据失败");
return;
}
else
{
QMessageBox::information(this,"数据表信息框","添加数据成功");
return;
}
}
/*--------------修改学生信息槽函数-----------------*/
void MyWidget::on_btn2_clicked()
{
//准备sql语句
QString sql;
//获取ui界面上的信息
int ui_id=ui->id_le->text().toUInt();//toUInt 转换成int型数据
QString ui_name=ui->name_le->text();
QString ui_sex=ui->sex_le->text();
double ui_score=ui->score_le->text().toDouble();//toDouble 转换成double型数据
//判断是否需要修改
if(ui_sex==NULL && ui->id_le->text().length()!=5 && ui_score==0 && ui_name==NULL)
{
QMessageBox::information(this,"修改信息框","请填写修改信息");
return;
}
else if(ui_sex!=NULL && ui->id_le->text().length()==5 && ui_score==0 && ui_name==NULL)
{
sql=QString("update Stu set sex = '%1' where id = %2").arg(ui_sex).arg(ui_id);//修改性别
}
else if(ui_name!=NULL && ui->id_le->text().length()==5 && ui_score==0 && ui_sex==NULL )
{
sql=QString("update Stu set name = '%1' where id = %2").arg(ui_name).arg(ui_id);//修改名字
}
else if(ui_name==NULL && ui->id_le->text().length()==5 && ui_score!=0 && ui_sex==NULL )
{
sql=QString("update Stu set score = %1 where id = %2").arg(ui_score).arg(ui_id);//修改成绩
}
else if(ui_name!=NULL && ui->id_le->text().length()==5 && ui_score==0 && ui_sex!=NULL )
{
sql=QString("update Stu set name = '%1', sex = '%2' where id = %3").arg(ui_name).arg(ui_sex).arg(ui_id);//修改姓名和性别
}
else if(ui_name!=NULL && ui->id_le->text().length()==5 && ui_score!=0 && ui_sex==NULL )
{
sql=QString("update Stu set name = '%1', score = %2 where id = %3").arg(ui_name).arg(ui_score).arg(ui_id);//修改姓名和成绩
}
else if(ui_name==NULL && ui->id_le->text().length()==5 && ui_score!=0 && ui_sex!=NULL )
{
sql=QString("update Stu set sex = '%1', score = %2 where id = %3").arg(ui_sex).arg(ui_score).arg(ui_id);//修改成绩和性别
}
else if(ui_name!=NULL && ui->id_le->text().length()==5 && ui_score!=0 && ui_sex!=NULL )
{
sql=QString("update Stu set name = '%1', sex = '%2', score = %3 where id = %4").arg(ui_name).arg(ui_sex).arg(ui_score).arg(ui_id);//修改姓名和性别和成绩
}
else
{
QMessageBox::information(this,"修改信息框","请正确填写修改信息");
return;
}
//实例化一个sql语句执行者,执行sql语句
QSqlQuery query;
if(!query.exec(sql))
{
QMessageBox::information(this,"修改信息框","修改信息失败");
return;
}
else
{
QMessageBox::information(this,"修改信息框","修改信息成功");
return;
}
}
/*--------------删除学生信息槽函数-----------------*/
void MyWidget::on_btn3_clicked()
{
//准备sql语句
QString sql;
if(ui->id_le->text()==NULL)
{
QMessageBox::information(this,"删除信息框","请填写id号");
return;
}
else if(ui->id_le->text()=="1")
{
sql="drop table Data";
}
else if(ui->id_le->text()!="1"&&ui->id_le->text()!=NULL)
{
sql=QString("delete from Stu where id = %1").arg(ui->id_le->text().toUInt());
}
//实例化一个sql语句执行者,执行sql语句
QSqlQuery query;
if(!query.exec(sql))
{
QMessageBox::information(this,"删除信息框","删除数据失败");
return;
}
else
{
QMessageBox::information(this,"删除信息框","删除数据成功");
return;
}
}
/*--------------查找学生信息槽函数-----------------*/
void MyWidget::on_btn4_clicked()
{
ui->tableWidget->clear();
//准备sql语句
QString sql;
if(ui->id_le->text()==NULL)
{
sql="select * from Stu";
}
else
{
sql=QString("select * from Stu where id='%1'").arg(ui->id_le->text().toUInt());
}
//实例化一个sql语句执行者,执行sql语句
QSqlQuery query;
if(!query.exec(sql))
{
QMessageBox::information(this,"数据表信息框","查找数据失败");
return;
}
int i=0;//数据表的行
//将查找结果展示到ui界面上
while(query.next())
{
//通过QSqlRecord中的成员函数record()获取数据表中的记录,count()获取数据表的列数,value()获取指定列的值
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++;
}
}