数据库的删除 查找
//查找对应的槽函数
void Widget::on_but3_clicked()
{
//获取ui界面中要存入的数据
//清空ui界面
ui->tableWidget->clear();
QString xm=ui->Edit2->text(); //姓名
QString sql="select * from myTable"; //准备sql语句
QSqlQuery querry; //准备语句执行者
if(!querry.exec(sql)) //查询表中所有的内容
{
QMessageBox::information(this,"失败","查询失败");
return;
}
int i=0; //记录行号
while(querry.next())
{
if(querry.record().value(2).toString()==xm)//如果相等 则循环行列进行输入
{
for(int j=0;j<querry.record().count()-1;j++)
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));//行列加内容
}
i++;
}
}
}
//删除对应的槽函数
void Widget::on_but4_clicked()
{
QString xm=ui->Edit2->text();//获取要删除人的姓名
QString sql=QString("delete from myTable where name="
"('%1')").arg(xm);
// "values(%1)").arg(xm);//准备sql语句1
qDebug()<<sql;
QSqlQuery querry; //准备执行语句者
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","删除的对象不存在");
return;
}
int i=0;
while(querry.next())
{
if(querry.record().value(2).toString()==xm)
{
for(int j=0;j<querry.record().count()-1;j++)
{
querry.record().value(j+1).clear();
}
}
}
}
查找
删除
展示
客户端:
#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::connected_slot);
//客戶端與服務器鏈接成功過後
//如果服務器向客戶端發送數據 那麽該客戶端就會自動發送一個readyread信號
//我們可以將信號連接到自定義的槽函數中
connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
Widget::~Widget()
{
delete ui;
}
//鏈接服務器按鈕對於槽函數
void Widget::on_but2_clicked()
{
//獲取ui界面的信息
userName =ui->Edit2->text();//獲取用戶名
QString hostName=ui->Edit3->text();//獲取主機地址
quint16 port=ui->Edit4->text().toUInt();//收取端口號
//調用函數鏈接到主機
//參數一 服務器主機地址
//參數二 端口號
//返回值 無
socket->connectToHost(hostName,port); //發送給鏈接請求
//如果鏈接服務器成功 該客戶端就會發送給一個connected 的信號
// 我們可以將該信號鏈接到自定義的槽函數中處理相關邏輯
// 由於鏈接只需要一次 所以 卸載構造函數中即可
// connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}
//關於處理connected信號的槽函數的定義
void Widget::connected_slot()
{
QMessageBox::information(this,"成功","鏈接服務器成功");
//順便向服務器發送一條消息 說 *** 進入聊天室
QString msg=userName+ ": 進入聊天室";
socket->write(msg.toLocal8Bit());
}
//關於readyread信號對於的槽函數實現
void Widget::readyRead_slot()
{
//讀取客戶端中的數據
QByteArray msg=socket->readAll();
//將數據展示在ui界面
ui->Widget_2->addItem(QString::fromLocal8Bit(msg));
}
//發生按鈕對應的槽函數
void Widget::on_but1_clicked()
{
QString m=ui->Edit1->text();
QString msg=userName + ":" +m;
socket->write(msg.toLocal8Bit());
ui->Edit1->clear();
}
//断开服务器按钮对应的槽函数
void Widget::on_but3_clicked()
{
QString msg=userName + ": 离开聊天室";
socket->write(msg.toLocal8Bit());
//调用成员函数disconnectFromHost
//函数原型: virtual void disconnectFromHost
//功能 断开客户端与服务器的链接
// 参数 无
// 返回值 无
socket->disconnectFromHost();
//当客户端与服务qi断开连接后 该客户端会自动发送一个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);
//給服務器指針實例化對象
server = new QTcpServer(this); //此時就創建了一個服務器
}
Widget::~Widget()
{
delete ui;
}
//啓動服務器按鈕的槽函數
void Widget::on_but1_clicked()
{
//獲取ui界面上的端口號
quint16 port=ui->Edit->text().toUInt();
//將服務器設置爲監聽狀態
//bool Qtcpserver::listen(const QHostAddress &address =QHostAdderess::Any,quint16 port=0)
//參數1 要監聽的主機地址 如果是any 表示監聽所有主機地址 也可以給特定主機地址進行接聽
//參數2 通過指定的端口號訪問服務器 如果是0 表示由服務器自動給分配如果非0 則代表指定端口號
//返回值 成功返回真 失敗返回假
if(!server->listen(QHostAddress::Any,port))
{
QMessageBox::critical(this,"失敗","服務器啓動時失敗");
}
//此時表面服務器鏈接成功 并對客戶端進行監聽 如果有客戶端向服務器發來鏈接請求
//那麽該服務器會自動發送一個newConnection信號
//我們可以將該信號鏈接到對於的槽函數
connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}
//處理newConnection信號的槽函數
void Widget::newConnection_slot()
{
qDebug()<<"有新的客戶端發來鏈接請求啦";
//獲取最新鏈接的客戶端套接字
QTcpSocket *s=server->nextPendingConnection();
//將獲取的套接字存放到客戶端容器中
clientList.push_back(s);
//此時客戶端就和服務器建立起來聯係
//如果該套接字有數據項服務器發送給過來 該套接字就會自動發射一個readyread信
//我們可以將該信號連接到自定義的cao函數中
connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
//關於readyread信號對於的槽函數
void Widget::readyRead_slot()
{
//刪除客戶端鏈表中的無效套接字
for(int i=0;i<clientList.size();i++)
{
//判斷套接字的狀態
//函數原型
//功能 返回客戶端的套接字狀態
//參數 無
//返回值 客戶端的狀態值 結果爲0 表示未連接
if(clientList[i]->state()==0)
{
clientList.removeAt(i); //將下表i的客戶端刪除掉
}
}
//遍歷所有客戶端 查看是那個客戶端發送的數據
for(int i=0;i<clientList.count();i++)
{
//函數原型 qint64 bytesAvailable() const override;
//功能 返回當前客戶端套接字中的刻度數據
//參數 無
//返回值 當前客戶端的可讀字節數 如果為0 表示無數據可讀
if(clientList[i]->bytesAvailable()!=0)
{
//讀取當前客戶端的相關數據
//函數原型 QByteArray readAll();
//功能 讀取當前套接字中的數據 并返回一個字節數組
//參數 無
// 返回值 數據的字節數組
QByteArray msg=clientList[i]->readAll();
//將數組展示到ui界面上
ui->Widget_2->addItem(QString::fromLocal8Bit(msg));
//將接收到的該消息 發送給給所有客戶端
for(int j=0;j<clientList.size();j++)
{
clientList[i]->write(msg);
}
}
}
}