?服務器端
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//準備組件,初始化組件狀態this->setFixedSize(800,600);chatwidget = new QListWidget(this);chatwidget->setFixedSize(800,430);chatwidget->setEnabled(false);portedit = new QLineEdit(this);portedit->resize(400,50);portedit->move(80,480);startbtn = new QPushButton("啟動",this);startbtn->setStyleSheet("background-color:red");startbtn->resize(150,80);startbtn->move(520,465);//startbtn按鈕的點擊信號與槽函數連接connect(startbtn,&QPushButton::clicked,this,&Widget::startbtn_slot);ser = new QTcpServer(this);//實意化服務器類對象connect(ser,&QTcpServer::newConnection,this,&Widget::serconnect_slot); //連接 每當新的客戶端連接,服務器發出的newconection信號 與對應的槽函數}
Widget::~Widget()
{delete ui;
}//startbtn按鈕的點擊信號對應的槽函數
void Widget::startbtn_slot()
{if(startbtn->text() == "啟動"){//啟動按鈕后調用監聽int port = portedit->text().toUInt();//獲取行編輯器輸入的端口號if(port<1024 || port>49151){QMessageBox::information(this,"提示","端口號不可用");return;}if(ser->listen(QHostAddress::Any,port)==true)//設置服務器的IP地址端口號,監聽狀態{//啟用聊天窗口,禁用端口行編輯器,設置按鈕背景色chatwidget->setEnabled(true);portedit->setEnabled(false);startbtn->setStyleSheet("background-color:blue");QMessageBox::information(this,"成功","服務器啟動成功");startbtn->setText("關閉");//啟動后將按鈕文本設置為關閉}else{QMessageBox::information(this,"失敗","服務器啟動失敗");}}else if(startbtn->text() == "關閉"){chatwidget->setEnabled(false);portedit->setEnabled(true);startbtn->setStyleSheet("background-color:red");QMessageBox::information(this,"成功","服務器關閉");startbtn->setText("開啟");//啟動后將按鈕文本設置為開啟}
}//服務器發出的newconection信號對應的槽函數處理
void Widget::serconnect_slot()
{QTcpSocket *socket = ser->nextPendingConnection();//返回連接到的客戶端信息clilist.append(socket);//將信息放到容器中保存//每當有客戶端向服務器發送數據時,socket會向服務器發送一個readyread信號connect(socket,&QTcpSocket::readyRead,this,&Widget::socket_readyread);//將所連接客戶端的服務器都連接到槽函數
}//處理socket發送的readyread信號的槽函數
void Widget::socket_readyread()
{//在這個函數內就可以實現數據收發//先遍歷鏈表中的客戶端,如果是無效鏈接則刪除掉for(int i=0;i<clilist.length();i++){//判斷連接狀態if(clilist[i]->state() == QTcpSocket::UnconnectedState) //判斷這個鏈接狀態是否是無效鏈接{//是則刪除clilist.removeAt(i);}//不是無效鏈接判斷是否有數據待讀else if(clilist[i]->bytesAvailable() != 0){QByteArray msg = clilist[i]->readAll();//將客戶端發來的數據督導msg里面chatwidget->addItem(QString::fromLocal8Bit(msg));//將信息展示在聊天框上//遍歷轉發除了發送信息客戶端for(int j=0;j<clilist.length();j++){if(i!=j){clilist[j]->write(msg);}}}}
}
客戶端?
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setFixedSize(800,600);chatwidget = new QListWidget(this);chatwidget->resize(800,400);chatwidget->setEnabled(false);usrlab = new QLabel("用戶名",this);usrlab->move(30,470);usredit = new QLineEdit(this);usredit->move(90,460);usredit->resize(300,30);iplab = new QLabel("ip",this);iplab->move(30,510);ipedit = new QLineEdit(this);ipedit->move(90,500);ipedit->resize(300,30);portlab = new QLabel("port",this);portlab->move(30,545);portedit = new QLineEdit(this);portedit->move(90,540);portedit->resize(300,30);msgedit = new QLineEdit(this);msgedit->move(90,410);msgedit->resize(400,40);msgedit->setEnabled(false);sendbtn = new QPushButton("發送",this);sendbtn->move(510,408);sendbtn->resize(150,47);
// sendbtn->setStyleSheet("background-color:red");sendbtn->setEnabled(false);connectbtn = new QPushButton("連接服務器",this);connectbtn->move(480,490);connectbtn->resize(200,80);connectbtn->setStyleSheet("background-color:red");cli = new QTcpSocket(this);//實意化客戶端類對象//點擊連接服務器按鈕的信號與槽函數連接connect(connectbtn,&QPushButton::clicked,&Widget::connectbtn_slot);connect(sendbtn,&QPushButton::clicked,&Widget::sendbtn_slot);//客戶端連接信號與槽函數連接connect(cli,&QTcpSocket::connected,this,&Widget::connected_slot);connect(msgedit,&QLineEdit::textChanged,this,&Widget::sentbtn_available_slot);}void Widget::connected_slot()
{QMessageBox::information(this,"連接","連接服務器成功!!");
}void Widget::connectbtn_slot()
{//一按鈕兩用if(connectbtn->text()=="連接服務器"){//點擊連接服務器之后獲取行編輯器的文本信息QString usrname=usredit->text();quint16 port=portedit->text().toUInt();QString ip=ipedit->text();//連接整個后禁用服務器端信息編輯,啟用聊天窗口和信息編輯器chatwidget->setEnabled(true);msgedit->setEnabled(true);usredit->setEnabled(false);ipedit->setEnabled(false);portedit->setEnabled(false);//向給定的IP地址端口號發送鏈接請求cli->connectToHost(ip,port);connectbtn->setText("斷開服務器");//連接成功后會發送cli會發送一個connected信號,對這個信號處理即可}else{//斷開連接整個后啟用服務器端信息編輯,禁用聊天窗口和信息編輯器usredit->setEnabled(true);ipedit->setEnabled(true);portedit->setEnabled(true);chatwidget->setEnabled(false);sendbtn->setEnabled(false);msgedit->setEnabled(false);QString msg = usrname + "離開聊天室" ;cli->write(msg.toLocal8Bit());cli->disconnectFromHost();connectbtn->setText("連接服務器");}
}void Widget::sendbtn_slot()
{QString msg= usrname + ":" + msgedit->text();cli->write(msg.toLocal8Bit());QString msg1=msgedit->text();QListWidgetItem *Item=new QListWidgetItem(msg1);Item->setTextAlignment(Qt::AlignRight); //自己發送的文本右邊顯示chatwidget->addItem(Item);msgedit->clear();
}//處理readyread對應槽函數
void Widget::readyRead_slot()
{QByteArray msg =cli->readAll();chatwidget->addItem(QString::fromLocal8Bit(msg));}void Widget::disconnect_slot()
{QMessageBox::information(this,"斷開","斷開服務器連接成功");
}void Widget::sentbtn_available_slot()
{if(msgedit->text().length()>0){sendbtn->setEnabled(true);}
}Widget::~Widget()
{delete ui;
}
?學生管理系統
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);if(!db.contains("mydb.db")){db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("mydb.db");}if(!db.open()){QMessageBox::information(this,"失敗","數據庫打開失敗");return;}QString sql = "create table if not exists Stu(numb int ,name char,sex char,score float);";QSqlQuery query;if(query.exec(sql)==false){QMessageBox::information(this,"提示","創建數據表失敗");return;}}Widget::~Widget()
{delete ui;
}void Widget::on_addbtn_clicked()
{ui->tableWidget->clear();//QString sql = QString(%1)int ui_numb=ui->numbedit->text().toUInt();QString ui_name= ui->nameedit->text();QString ui_sex = ui->sexedit->text();float ui_score = ui->scoreedit->text().toFloat();if(ui_sex==NULL || ui_numb==0 || ui_score==0 || ui_name==NULL){QMessageBox::information(this,"提示","請將信息填寫完整");return;}else if(!(ui_sex == "男" || ui_sex == "女")){QMessageBox::information(this,"提示","性別信息錯誤");return;}QString sql = QString("insert into Stu values(%1,'%2','%3',%4);").arg(ui_numb).arg(ui_name).arg(ui_sex).arg(ui_score);QSqlQuery query;if(query.exec(sql)){QMessageBox::information(this,"提示","添加數據成功");ui->numbedit->clear();ui->nameedit->clear();ui->sexedit->clear();ui->scoreedit->clear();return;}else{QMessageBox::information(this,"提示","添加數據失敗");return;}
}void Widget::on_searchbtn_clicked()
{ui->tableWidget->clear();QString sql;if(ui->numbedit->text()==NULL){sql = "select * from Stu";}else{sql = QString("select * from stu where numb=%1;").arg(ui->numbedit->text());}QSqlQuery query;if(!query.exec(sql)){QMessageBox::information(this,"提示","查詢失敗");return;}int i=0;while(query.next()){//任意一個查詢的結果//qDebug() << query.record().value(1).toString();for(int j=0;j<query.record().count();j++){qDebug() << query.record().value(j).toString();QTableWidgetItem *Item=new QTableWidgetItem(query.record().value(j).toString());Item->setTextAlignment(Qt::AlignCenter);ui->tableWidget->setItem(i,j,Item);}i++;}
}void Widget::on_updatabtn_clicked()
{ui->tableWidget->clear();int ui_numb=ui->numbedit->text().toUInt();QString ui_name= ui->nameedit->text();QString ui_sex = ui->sexedit->text();float ui_score = ui->scoreedit->text().toFloat();if(ui_sex==NULL || ui_numb==0 || ui_score==0 || ui_name==NULL){QMessageBox::information(this,"提示","請將信息填寫完整");return;}else if(!(ui_sex == "男" || ui_sex == "女")){QMessageBox::information(this,"提示","性別信息錯誤");return;}//QString sql = QString("update Stu set numb=%1 where name='%2'").arg(ui_numb).arg(ui_name);//qDebug() << sql;QString sql = QString("update Stu set name='%1',sex='%2',score=%3 where numb=%4;").arg(ui_name).arg(ui_sex).arg(ui_score).arg(ui_numb);QSqlQuery query;if(query.exec(sql))//{QMessageBox::information(this,"提示","修改數據成功");ui->numbedit->clear();ui->nameedit->clear();ui->sexedit->clear();ui->scoreedit->clear();return;}else{QMessageBox::information(this,"提示","修該數據失敗");query.lastError();return;}
}
//lasrErrorvoid Widget::on_delbtn_clicked()
{ui->tableWidget->clear();int ui_numb=ui->numbedit->text().toUInt();if( ui_numb==0 ){QMessageBox::information(this,"提示","請填寫正確學號");return;}QString sql = QString("delete from Stu where numb=%1;").arg(ui_numb);QSqlQuery query;if(query.exec(sql))//{QMessageBox::information(this,"提示","刪除數據成功");ui->numbedit->clear();ui->nameedit->clear();ui->sexedit->clear();ui->scoreedit->clear();return;}else{QMessageBox::information(this,"提示","刪除數據失敗");query.lastError();return;}
}void Widget::on_sortbtn_clicked()
{// int ui_numb=ui->numbedit->text().toUInt();
// QMessageBox box(QMessageBox::Question,"選擇","請選擇學號或者分數排序",QMessageBox::Ok|QMessageBox::Save);
// box.setDefaultButton(QMessageBox::Ok);
// box.setButtonText(QMessageBox::Ok,"學號");
// box.setButtonText(QMessageBox::Save,"分數");
// int res = box.exec();
// QString sql;
// if(res==QMessageBox::Ok)
// {
// sql = QString("select * from Stu order by numb asc");
// }
// else if(res==QMessageBox::Save)
// {
// sql = QString("select * from Stu order by score asc");
// }QString sql="select * from Stu ORDER BY score;";QSqlQuery query;ui->tableWidget->clear();if(query.exec(sql))//{QMessageBox::information(this,"提示","更改排序成功");ui->numbedit->clear();ui->nameedit->clear();ui->sexedit->clear();ui->scoreedit->clear();return;}else{QMessageBox::information(this,"提示","更改排序失敗");query.lastError();return;}}
?