day 6

数据库的删除 查找

//查找对应的槽函数
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);
           }
       }
   }



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值