#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//抢占上层
setWindowFlags(Qt::WindowStaysOnTopHint);
//创建子窗口对象
mydialog=new MyDialog(this);
colorDialod =new QColorDialog(this);
//创建按钮组管理按钮
group =new QButtonGroup(this);
group->addButton(ui->pushButtonConnect,1);
group->addButton(ui->pushButtonSetName,2);
group->addButton(ui->pushButtonChangeName,3);
group->addButton(ui->pushButtonSendMsg,4);
group->addButton(ui->pushButtonHistory,5);
group->addButton(ui->pushButtonClear,6);
group->addButton(ui->pushButtonDeleteHistory,7);
group->addButton(ui->pushButtonExit,8);
group->addButton(ui->pushButtonDefault,9);
group->addButton(ui->pushButtonOnlineNum,10);
group->addButton(ui->pushButtonFontColor,11);
group->addButton(ui->pushButtonCloseHistory,12);
connect(group,SIGNAL(buttonClicked(int)),this,SLOT(btnsClickedSlot(int)));
//创建TCP通信对象
client =new QTcpSocket(this);
connect(client,SIGNAL(disconnected()),this,SLOT(disconnectedSlot()));
connect(client,SIGNAL(readyRead()),this,SLOT(readyReadSlot()));
//创建数据库及表
connectDBAndCreatTable();
//捕获输入框内的回车事件,防止触发窗口其他按钮
ui->lineEditIP->setFocus();
ui->lineEditIP->installEventFilter(this);
ui->lineEditName->setFocus();
ui->lineEditName->installEventFilter(this);
ui->textEdit->setFocus();
//连接回车键对键入信息栏使能信号槽
connect(ui->radioButton,SIGNAL(toggled(bool)),this,SLOT(rdbtnToggledSlot(bool)));
//连接字体选择信号槽
connect(ui->fontComboBox,SIGNAL(currentTextChanged(QString)),this,SLOT(fontBoxTextChangedSlot(QString)));
//连接背景选择信号槽
connect(ui->comboBoxGroundColor,SIGNAL(currentIndexChanged(QString)),this,SLOT(currentIndexChangedSlot(QString)));
//连接字号选择信号槽
connect(ui->comboBoxFontSize,SIGNAL(currentIndexChanged(QString)),this,SLOT(fontSizeChangedSlot(QString)));
//连接颜色对话框选择颜色信号槽
connect(colorDialod,SIGNAL(colorSelected(QColor)),this,SLOT(colorSelectedSlot(QColor)));
}
Dialog::~Dialog()
{
if(client->isOpen())
client->close();
delete ui;
}
//获取IP连接服务器
void Dialog::btnConnectClicked()
{
QString ip=ui->lineEditIP->text();
int port=6226;
client->connectToHost(ip,port);
}
//设置网名,修改需点击修改按钮重新设置
void Dialog::btnSetNameClicked()
{
name =ui->lineEditName->text();
if(name=="")
{
QMessageBox::warning(this,"提示","请设置您的网名");
return;
}
ui->pushButtonSetName->setEnabled(false);
ui->pushButtonChangeName->setEnabled(true);
}
//修改网名
void Dialog::btnChangeNameClicked()
{
ui->pushButtonChangeName->setEnabled(false);
ui->pushButtonSetName->setEnabled(true);
}
//向服务器发送信息,将发送的信息显示到信息显示对话框
//信息保存本地数据库
void Dialog::btnSendMsgClicked()
{
QString msg=ui->textEdit->toPlainText();
ui->textEdit->clear();
if(name=="")
{
QMessageBox::warning(this,"提示","请输入您的网名");
return;
}
if(msg=="")
{
QMessageBox::warning(this,"提示","请输入信息内容");
return;
}
if(msg.size()>1024)
{
QMessageBox::warning(this,"提示","信息字数过多,请重新发送");
return;
}
QString time=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
QString text=name+QString(":")+msg;
ui->textBrowser->append(time);
ui->textBrowser->append(text);
//向服务器发送消息内容
QTextStream output(client);
output<<text;
//信息保存数据库
text.prepend("(我)");
insertDataToTable(time,text);
}
//新建窗口显示历史记录
void Dialog::btnHistoryClicked()
{
ui->pushButtonHistory->setEnabled(false);
ui->pushButtonCloseHistory->setEnabled(true);
mydialog->changePosition(this->x()+this->width(),this->y(),ui->textBrowser->width(),this->height());
mydialog->show();
mydialog->selectAllHistory();
}
//清空消息对话框
void Dialog::btnClearClicked()
{
ui->textBrowser->clear();
}
//清空历史记录表
void Dialog::btnDeleteHisClicked()
{
QString sql="DELETE FROM history";
QSqlQuery sq;
if(sq.exec(sql))
{
qDebug()<<"删除成功";
}else
{
qDebug()<<"失败";
}
//判断历史记录子窗口是否显示可见
if(mydialog->isVisible())
{
mydialog->close();
btnHistoryClicked();
}
}
//退出聊天室
void Dialog::btnExitClicked()
{
client->disconnectFromHost();
}
//恢复对话框默认设置
void Dialog::btnDefaultClicked()
{
ui->fontComboBox->setCurrentText("宋体");
ui->comboBoxFontSize->setCurrentText("默认");
ui->comboBoxGroundColor->setCurrentIndex(0);
QColor color(0,0,0);
colorSelectedSlot(color);
}
//获取在线人数
void Dialog::btnOnlineClicked()
{
QString text="Online users";
QTextStream output(client);
output<<text;
}
//更改对话框文字颜色按钮按下,显示颜色对话框
void Dialog::btnFontColorClicked()
{
colorDialod->open();
}
//关闭历史记录窗口
void Dialog::btnCloseHisClicked()
{
mydialog->close();
ui->pushButtonCloseHistory->setEnabled(false);
ui->pushButtonHistory->setEnabled(true);
}
//连接数据库并创历史记录表
void Dialog::connectDBAndCreatTable()
{
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("history.db");
if(db.open())
{
qDebug()<<"数据库连接成功";
QString sql="CREATE TABLE history(time CHAR,msg CHAR);";
QSqlQuery sq;
if(sq.exec(sql))
{
qDebug()<<"创表ok";
}else
{
qDebug()<<sq.lastError().text().prepend("创表失败:");
}
}else
{
QString text =db.lastError().text();
QMessageBox::critical(this,"错误",text.prepend("数据库连接失败!"));
}
}
//数据库表中插入数据
void Dialog::insertDataToTable(const QString &time, const QString &msg)
{
QString sql="INSERT INTO history VALUES(?,?)";
QSqlQuery sq;
sq.prepare(sql);
sq.addBindValue(time);
sq.addBindValue(msg);
if(sq.exec())
{
qDebug()<<"添加成功";
}else
{
qDebug()<<"失败";
}
}
//按钮组点击槽函数
void Dialog::btnsClickedSlot(int id)
{
if(id==1)
{
btnConnectClicked();
}else if(id ==2)
{
btnSetNameClicked();
}else if(id ==3)
{
btnChangeNameClicked();
}else if(id ==4)
{
btnSendMsgClicked();
}else if(id==5)
{
btnHistoryClicked();
}else if(id==6)
{
btnClearClicked();
}else if(id==7)
{
btnDeleteHisClicked();
}else if(id==8)
{
btnExitClicked();
}else if(id==9)
{
btnDefaultClicked();
}else if(id==10)
{
btnOnlineClicked();
}else if(id==11)
{
btnFontColorClicked();
}else if(id==12)
{
btnCloseHisClicked();
}
}
//聊天室断开连接信号对应的槽函数
void Dialog::disconnectedSlot()
{
QMessageBox::information(this,"提示","已从聊天室断开连接");
btnCloseHisClicked();
ui->textBrowser->clear();
ui->textEdit->clear();
ui->lineEditName->clear();
btnDefaultClicked();
ui->pushButtonConnect->setEnabled(true);
ui->pushButtonSetName->setEnabled(false)
基于Qt设计的的多人网络聊天室
需积分: 0 107 浏览量
更新于2023-07-03
4
收藏 168KB ZIP 举报
:“基于Qt设计的多人网络聊天室”
在IT领域,Qt是一个广泛使用的跨平台应用程序开发框架,它由The Qt Company提供,并被开源社区广泛支持。本项目“基于Qt设计的多人网络聊天室”利用Qt Creator作为集成开发环境(IDE),构建了一个能够支持50人同时在线交流的应用程序。Qt Creator提供了直观的界面设计工具和高效的代码编辑器,使得开发者可以轻松创建具有图形用户界面(GUI)的多平台应用。
中提到的关键知识点包括:
1. **Qt Creator**:这是一个用于C++开发的免费且开源的IDE,集成了项目管理、编辑器、构建系统和调试器,特别适合于Qt应用程序的开发。其丰富的特性如代码补全、语法高亮和实时错误检查,提高了开发效率。
2. **多人聊天功能**:实现这样的功能通常需要网络编程技术,如套接字编程。在本项目中,可能采用了TCP或UDP协议来建立客户端与服务器之间的连接,实现数据的可靠传输或高效传输。
3. **并发处理**:由于聊天室可容纳50人同时在线,因此需要有效地处理多个并发连接。Qt提供了线程库,如QThread,可以用来实现多线程,确保不同用户交互的并行处理,提高系统的响应速度。
4. **基础功能设计**:这可能包括用户注册、登录、发送消息、接收消息、查看历史记录、表情支持等功能。这些都需要对UI设计有深入理解,以及对字符串处理、数据存储等技术的掌握。
5. **网络编程**:在网络通信中,可能使用了QTcpSocket或QUdpSocket类来建立和维护网络连接,进行数据的收发。同时,为了保持实时性,可能还涉及到心跳包的设计,以检测网络连接是否正常。
6. **数据库集成**:为了存储用户信息、聊天记录等数据,项目很可能使用了数据库。Qt提供了QSqlDatabase模块,可以方便地与各种数据库系统(如SQLite、MySQL、PostgreSQL等)进行交互。
7. **安全性考虑**:在多人聊天环境中,数据安全是至关重要的。项目可能采用了加密技术,如SSL/TLS,来保护用户的隐私信息和通信内容不被窃取。
中的“qt”、“网络”和“数据库”也揭示了项目所涉及的技术点:
- **Qt**:涵盖了前面提到的Qt Creator和Qt库,是实现整个项目的基础。
- **网络**:强调了网络编程的重要性,包括套接字编程、并发处理、网络协议等。
- **数据库**:表明项目采用了数据库存储数据,可能涉及SQL查询和事务处理。
这个项目不仅涵盖了Qt GUI开发,还包括了网络编程和数据库管理等多个IT核心技术,是学习和实践这些技能的一个良好实例。通过深入理解和实现这样的项目,开发者可以提升自己在软件工程方面的综合能力。

史莱姆·张
- 粉丝: 1
- 资源: 2
最新资源
- CNN-LSTM时间预测分析:单输入单输出电力负荷预测模型.pdf
- CNN-LSTM数据分类预测MATLAB代码:基于卷积神经网络-长短期记忆网络,主程序可读取本地EXCEL数据.pdf
- CNN-LSTM组合算法回归预测:精准预测的Matlab实现,程序注释清晰.pdf
- CNN-LSTM组合预测模型(多列输入、单列输出回归预测模型,2020版及以上,含基本注释代码).pdf
- CNN-RVM多变量回归预测Matlab程序(附测试数据及图例).pdf
- CNN-RNN网络在电力负荷预测中的应用:Matlab作图,单输入单输出模型.pdf
- CNN-SVM回归预测模型:基于MATLAB 2019及以上版本的'多输入单输出'模型,包含清晰中文注释与高质量评价指标.pdf
- CNN-SVM多特征分类预测(Matlab代码实现:直接替换数据即可使用,环境要求Matlab2018b及以上)》.pdf
- CNN-SVM结合的MISO回归预测模型:'MainCNN_SVR.m'主文件及使用说明.pdf
- CNN分类中应用随机擦除增强的MATLAB源码分享.pdf
- CNN卷积神经网络FPGA加速器实现(小型)_ 从软件到硬件的深度学习部署.pdf
- CNN卷积神经网络多变量回归预测(Matlab):'经验证'的7输入1输出程序.pdf
- CNN卷积神经网络多输入多输出预测(Matlab)_ 10个输入特征、3个输出变量的验证程序.pdf
- CNN卷积神经网络回归预测算法(基于Matlab 2018b以上版本实现)的代码与样本.pdf
- CNN卷积神经网络用于时间序列预测的高精度Matlab程序.pdf
- CNN卷积神经网络在Matlab中实现多特征分类预测:保证在Matlab 2018b及以上环境下有效运行,可视化输出分类准确率,输入12个特征输出4类标签.pdf