QT数据库操作

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

你可能感兴趣的:(qt,数据库,开发语言)