#include "dialog.h"
#include "ui_dialog.h"
#include <QThread>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// 界面置顶
setWindowFlags(Qt::WindowStaysOnTopHint);
server = new QTcpServer(this);
// 开启监听
bool result = server->listen(QHostAddress::Any,7456);
if(result)
{
printMsg("监听开启成功,端口号7456");
connect(server,SIGNAL(newConnection()),
this,SLOT(newConnectionSlot()));
}
else
printMsg("监听开启失败!");
//连接数据库
connect2DB();
}
Dialog::~Dialog()
{
// 关闭
server->close();
// 如果数据库连接还在打开,则关闭
if(db.isOpen())
db.close();
delete ui;
}
void Dialog::paintEvent(QPaintEvent *)
{
///创建画家对象
/// 参数为哪儿画,继承QPaintDevice的类对象才能被绘制
QPainter painter(this);
//创建一个要画的图片对象
QPixmap pic(":/new/prefix1/bd.jpg");
//开始绘制
//参数1/2:绘制的坐标;
//参数3&4:绘制的宽高;
//参数5:绘制的内容;
painter.drawPixmap(0,0,this->width(),this->height(),pic);
//使lineEdit控件透明
ui->textBrowser->setStyleSheet("QTextBrowser { background-color: transparent; }");
ui->lineEditCount->setStyleSheet("QLineEdit { background-color: transparent; }");
}
/**
* @brief Dialog::printMsg 在公屏上显示信息
* @param msg 要显示的信息
*/
void Dialog::printMsg(QString msg)
{
// 获得日期时间
QString dt = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
// 显示到公屏上
ui->textBrowser->append(dt);
ui->textBrowser->append(msg);
}
//创建并连接数据库
void Dialog::connect2DB()
{
// 创建连接对象
db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库文件名称
db.setDatabaseName("chat_msg.db");
// 打开数据库连接
if(db.open())
{
qDebug() << "连接成功!";
// 建表
createLoginTable();
createChatTable();
}else
{
// 获得错误细信息封装类
QSqlError info = db.lastError();
// 提取错误信息
QString text = info.text();
// 展示错误
QMessageBox::critical(this,"错误",text);
}
}
//创建注册登录表
void Dialog::createLoginTable()
{
QString sql = "CREATE TABLE login_msg(user_name TEXT,password TEXT);";
// 创建数据库操作类对象
QSqlQuery sq;
if(sq.exec(sql)) // 如果执行成功
{
qDebug() << "建表成功!";
}else //失败
{
// 获得错误细信息封装类
QSqlError info = sq.lastError();
// 提取错误信息
QString text = info.text();
qDebug() << "建表失败!" << text;
}
}
//创建聊天表
void Dialog::createChatTable()
{
QString sql = "CREATE TABLE chat(dt TEXT,nickname TEXT,msg TEXT);";
// 创建数据库操作类对象
QSqlQuery sq;
if(sq.exec(sql)) // 如果执行成功
{
qDebug() << "建表成功!";
}else //失败
{
// 获得错误细信息封装类
QSqlError info = sq.lastError();
// 提取错误信息
QString text = info.text();
qDebug() << "建表失败!" << text;
}
}
//新连接
void Dialog::newConnectionSlot()
{
socket=server->nextPendingConnection();
QTextStream output(socket);
if(clients.size()>=20)
{
qDebug()<<"客户端已满";
output<<QString("客户端已满,连接失败!");
socket->close();
}
printMsg("新连接已建立!");
clients.append(socket);
//显示连接数
ui->lineEditCount->setText(QString::number(clients.size()));
// 读取消息的信号槽
connect(socket,SIGNAL(readyRead()),
this,SLOT(readyReadSlot()));
//掉线的信号槽
connect(socket,SIGNAL(disconnected()),
this,SLOT(disconnSlot()));
// 拿到对面的IP地址和端口号并展示
QString ip = socket->peerAddress().toString();
quint16 port = socket->peerPort();
QString text = ip.append(":") + QString::number(port);
printMsg(text.append(" 已上线"));
ui->textBrowser->append("");
//给客户端打招呼
output << QString("欢迎来到聊天室!");
}
//读
void Dialog::readyReadSlot()
{
socket=(QTcpSocket*)sender();
for(int i=0;i<clients.size();i++)
{
// if(socket==clients.at(i))
if(clients.at(i)->isReadable() && clients.at(i)->bytesAvailable()>0)
{
//建立读通道
QTextStream input(clients.at(i));
QString text = input.readAll();
//建立写通道
QTextStream output(socket);
//将读到的信息格式处理
QStringList list = text.split(":");
//注册信息,服务器接收通过“:”拆分长度为2
if(list.size()==2)
{
QString id=list.value(0);
QString password=list.value(1);
if(isDataExists(id))
{
//账号已存在,不能注册
output << QString("账号已存在");
qDebug()<<"账号已存在";
}
else
{
// 预处理的SQL语句
QString sql = "INSERT INTO login_msg VALUES(?,?)";
QSqlQuery sq;
sq.prepare(sql); // 预处理
// 绑定参数
sq.addBindValue(id);
sq.addBindValue(password);
// 执行绑定后的SQL语句
if(sq.exec())
{
output<<QString("注册成功");
qDebug()<<"注册数据插入成功!";
}else //失败
{
// 获得错误细信息封装类
QSqlError info = sq.lastError();
// 提取错误信息
QString msg = info.text();
msg.prepend("数据插入操作失败!");
QMessageBox::warning(this,"通知",msg);
}
}
}
//服务器接收通过“:”拆分长度为3
if(list.size()==3)
{
if(list.value(0)=="按时间查询")
{
QString datatime=list.value(1);
selectTime(datatime,i);
}
else if(list.value(0)=="按昵称查询")
{
QString nickname=list.value(1);
selectNickname(nickname);
}
else if(list.value(0)=="按消息内容查询")
{
QString msg=list.value(1);
selectMsg(msg);
}
else
{
//登录
QString user_name = list.value(0);
QString password = list.value(1);
//账号密码正确,登陆成功
if(isLoginExists(user_name,password))
{
output << QString("登录成功");
}
else
{
output<<QString("登录失败");
}
}
}
//收到聊天信息,服务器接收通过“:”拆分长度为4
if(list.size()==4)
嵌新程
- 粉丝: 1900
- 资源: 16
最新资源
- 2024年江西省职业院校技能大赛:GZ015-机器人系统集成应用技术(学生赛)赛项(高职组)样题
- 适用Centos7/8/9的libpcap、libpcap-devel离线安装包rpm
- MPC模型预测控制,风电调频,风储调频 在风储调频基础上加了MPC控制,复现的EI文献 MPC控制预测频率变化,进而改变风电出力 实时改变风电出力调频 创新就是, 仿真对比了实际仿真和在MP
- 圆管自动上料机sw16可编辑全套技术资料100%好用.zip
- NSFileNotFoundError如何解决.md
- TabError.md
- GlobalMixinError解决办法.md
- SystemError.md
- MalformedURLException(解决方案).md
- SystemExit.md
- FilterError解决办法.md
- UnknownHostException(解决方案).md
- NSFileAlreadyExistsError如何解决.md
- ConnectException(解决方案).md
- NSOutOfMemoryError如何解决.md
- DependencyInjectionError解决办法.md
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈