QTday5

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++;
    }
}























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值