#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 {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,失败返回falseif( 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 {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.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();
}