#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
if(!db.contains("student.db"))
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("student.db");
}
if(!db.isOpen())
{
if(!db.open())
{
QMessageBox::information(this,"","数据库打开失败");
return;
}
}
QSqlQuery querry;
QString sql="create table if not exists stu_table("
"id integer primary key autoincrement,"
"numb integer,"
"name varchar(20),"
"cla varchar(20),"
"cj integer)";
if(!querry.exec(sql))
{
QMessageBox::critical(this,"","create table wrong");
return;
}else{
QMessageBox::information(this,"","create table success");
}
};
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_addBtn_clicked()
{
int numb=ui->xhEdit->text().toInt();
QString name=ui->xmEdit->text();
QString cla=ui->bgEdit->text();
int cj=ui->cjEdit->text().toInt();
if(numb==0||name.isEmpty()||cla.isEmpty()||cj==0)
{
QMessageBox::information(this,"","dfafdsafds");
return;
}
QSqlQuery querry;
QString sql=QString("insert into stu_table(numb,name,cla,cj) "
"value('%1','%2','%3','%4');")
.arg(numb).arg(name).arg(cla).arg(cj);
if(!querry.exec(sql))
{
QMessageBox::critical(this,"","add fail");
return;
}else{
QMessageBox::information(this,"","add success");
}
}
void MainWindow::on_dipBtn_clicked()
{
QString sql="select * from stu_table";
QSqlQuery querry;
if(!querry.exec(sql))
{
QMessageBox::critical(this,"","operate fail");
return;
}
int i=0;
while(querry.next())
{
//querry.record();
//record中的函数成员count 能获取当前记录的键个数
for(int j=0;j<querry.record().count()-1;j++)
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));
}
i++;
}
}
2.服务器
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//给服务器指针实例化对象
server = new QTcpServer(this);
}
Widget::~Widget()
{
delete ui;
}
//创建服务器对应的槽函数
void Widget::on_connectBtn_clicked()
{
//获取ui界面上的端口号
quint16 port = ui->portEdit->text().toUInt();
//将服务器设置成监听状态
//bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
//功能:将服务器设置成监听状态
//参数1:连接的主机地址,QHostAddress::Any,允许任意主机进行连接,当然,也可以指定主机号进行连接
//参数2:连接进来所需端口号,0表示任意端口号进行访问,也可以指定端口号进行访问服务器
//返回值:成功返回true,失败返回false
if( server->listen(QHostAddress::Any, port) )
{
QMessageBox::information(this, "", "创建服务器成功");
}else
{
QMessageBox::information(this, "", "创建服务器失败");
return;
}
//将按钮设置成不可用状态
ui->connectBtn->setEnabled(false);
//如果有客户端发来连接请求,服务器会触发一个newconnect的信号,我们将该信号连接到自定义的槽函数中,处理相关逻辑
connect(server, &QTcpServer::newConnection, this, &Widget::on_newconnect);
//功能:将服务器触发的信号,连接到自定义的槽函数中
//参数1:服务器指针发送信号
//参数2:发射的信号名称
//参数3:本界面接受信号
//参数4:自定义的槽函数
}
//自定义处理newConnect信号的槽函数
void Widget::on_newconnect()
{
//获取新链接的客户端套接字
//[virtual] QTcpSocket *QTcpServer::nextPendingConnection()
//功能:获取最新一次连接的客户端套接字
//参数:无
//返回值:最新连接客户端的套接字
QTcpSocket * s = server->nextPendingConnection();
//将新的套接字放入到客户端链表中
socket.push_back(s);
connect(s, &QTcpSocket::readyRead, this, &Widget::on_readyRead);
}
void Widget::on_readyRead()
{
for(int i=0; i<socket.size(); i++)
{
if(socket.at(i)->state() == 0)
{
socket.removeAt(i);
}
}
if(socket.at(i)->bytesAvailable() != 0)
{
QByteArray msg = socket.at(i)->readAll();
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
for(int j=0; j<socket.size(); j++)
{
socket.at(j)->write(msg);
}
}
}
}
客户端:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//给客户端指针实例化对象
socket = new QTcpSocket(this);
//将客户端发射的connected的信号与自定义的槽函数连接
connect(socket, &QTcpSocket::connected, this, &Widget::on_connected);
//当客户端接受到服务器发来的数据后,客户端自身会触发一个readyRead信号
//我们将该信号与自定义的槽函数连接,处理接收后的数据
connect(socket, &QTcpSocket::readyRead, this, &Widget::on_readyRead);
//我们将该信号连接到对应的槽函数中,可以处理相关逻辑
connect(socket, &QTcpSocket::disconnected, [](){
QMessageBox::information(NULL, "", "离开成功");
});
}
Widget::~Widget()
{
delete ui;
}
//连接按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{
if(ui->connectBtn->text() == "连接服务器")
{
//获取ui界面上的主机地址
QString ip = ui->ipEdit->text();
//获取ui界面上的端口号
quint16 port = ui->portEdit->text().toUInt();
//获取ui界面上的用户名
userName = ui->userNameEdit->text();
//连接操作
//void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
//功能:将客户端连接到服务器
//参数1:要连接的服务器主机地址
//参数2:服务器的端口号
//参数3:打开方式,默认为读写模式
socket->connectToHost(ip, port);
//此时客户端和服务器就建立起联系,如果成功连接,客户端就会自动触发一个connected的信号
//我们将该信号与自定义的槽函数进行连接,只需连接一次,所以连接函数可以写在构造函数中
//将按钮文本改为断开服务器
ui->connectBtn->setText("断开服务器");
}else
{
QString msg = userName + ": 离开聊天室";
socket->write(msg.toLocal8Bit());
//断开服务器操作
socket->disconnectFromHost();
//当成功断开服务器后,客户端也会自动触发一个disconnected的信号
//将按钮文本改为连接服务器
ui->connectBtn->setText("连接服务器");
}
}
//处理connected信号的槽函数的定义
void Widget::on_connected()
{
QMessageBox::information(this,"", "连接成功");
//给服务器发送一个消息说:***:进入聊天室
QString msg = userName + ": 进入聊天室";
//将消息发送给服务器
socket->write(msg.toLocal8Bit());
}
//自定义的处理readyRead信号的槽函数
void Widget::on_readyRead()
{
//接收服务器发来的数据
QByteArray msg = socket->readAll();
//将信息展示到ui界面
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}
//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{
//获取ui界面上的消息
QString msg = userName+ ": " + ui->msgEdit->text();
//将数据发送给服务器
socket->write(msg.toLocal8Bit());
//清空消息编辑器中的内容
ui->msgEdit->clear();
}