#include "widget.h"
#include "ui_widget.h"
#include <QUdpSocket>
#include <QHostInfo>
#include <QMessageBox>
#include <QScrollBar>
#include <QDateTime>
#include <QNetworkInterface>
#include <QProcess>
#pragma execution_character_set("utf-8")//设置中文= =
#include "server.h"
#include "client.h"
#include <QFileDialog>
#include"qtrsa.h"
#include <QColorDialog>
Widget::Widget(QWidget *parent,QString usrname) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
uName = usrname;
udpSocket = new QUdpSocket(this);
port = 23232;
udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
sndMsg(UsrEnter);
srv = new Server(this);
connect(srv, SIGNAL(sndFileName(QString)), this, SLOT(getFileName(QString)));
setFixedSize(806,515);
connect(ui->msgTxtEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)),this, SLOT(curFmtChanged(const QTextCharFormat)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::sndMsg(MsgType type, QString srvaddr)//发送信息
{
QByteArray data;
QDataStream out(&data, QIODevice::WriteOnly);
QString address = getIP();
out << type << getUsr();
switch(type)//根据不同的状态执行
{
case Msg :
if (ui->msgTxtEdit->toPlainText() == "") {
QMessageBox::warning(0,tr("警告"),tr("发送内容不能为空"),QMessageBox::Ok);
return;
}
out << address << getMsg();
ui->msgBrowser->verticalScrollBar()->setValue(ui->msgBrowser->verticalScrollBar()->maximum());
break;
case UsrEnter :
out << address;
break;
case UsrLeft :
break;
case FileName : {
int row = ui->usrTblWidget->currentRow();
QString clntaddr = ui->usrTblWidget->item(row, 1)->text();
out << address << clntaddr << fileName;
break;
}
case Refuse :
out << srvaddr;
break;
}
udpSocket->writeDatagram(data,data.length(),QHostAddress::Broadcast, port);
}
void Widget::processPendingDatagrams()
{
while(udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(), datagram.size());
QDataStream in(&datagram, QIODevice::ReadOnly);
int msgType;
in >> msgType;
QString usrName,ipAddr,msg;
QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
switch(msgType)
{
case Msg:
in >> usrName >> ipAddr >> msg;
ui->msgBrowser->setTextColor(Qt::blue);
ui->msgBrowser->setCurrentFont(QFont("Times New Roman",12));
ui->msgBrowser->append("[ " +usrName+" ] "+ time);
ui->msgBrowser->append(msg);
break;
case UsrEnter:
in >>usrName >>ipAddr;
usrEnter(usrName,ipAddr);
break;
case UsrLeft:
in >>usrName;
usrLeft(usrName,time);
break;
case FileName: {
in >> usrName >> ipAddr;
QString clntAddr, fileName;
in >> clntAddr >> fileName;
hasPendingFile(usrName, ipAddr, clntAddr, fileName);
break;
}
case Refuse: {
in >> usrName;
QString srvAddr;
in >> srvAddr;
QString ipAddr = getIP();
if(ipAddr == srvAddr)
{
srv->refused();
}
break;
}
}
}
}
void Widget::usrEnter(QString usrname, QString ipaddr)
{
bool isEmpty = ui->usrTblWidget->findItems(usrname, Qt::MatchExactly).isEmpty();
if (isEmpty) {
QTableWidgetItem *usr = new QTableWidgetItem(usrname);
QTableWidgetItem *ip = new QTableWidgetItem(ipaddr);
ui->usrTblWidget->insertRow(0);
ui->usrTblWidget->setItem(0,0,usr);
ui->usrTblWidget->setItem(0,1,ip);
ui->msgBrowser->setTextColor(Qt::gray);
ui->msgBrowser->setCurrentFont(QFont("Times New Roman",10));
ui->msgBrowser->append(tr("%1 在线!").arg(usrname));
ui->usrNumLbl->setText(tr("在线人数:%1").arg(ui->usrTblWidget->rowCount()));
sndMsg(UsrEnter);
}
}
void Widget::usrLeft(QString usrname, QString time)
{
int rowNum = ui->usrTblWidget->findItems(usrname, Qt::MatchExactly).first()->row();
ui->usrTblWidget->removeRow(rowNum);
ui->msgBrowser->setTextColor(Qt::gray);
ui->msgBrowser->setCurrentFont(QFont("Times New Roman", 10));
ui->msgBrowser->append(tr("%1 于 %2 离开!").arg(usrname).arg(time));
ui->usrNumLbl->setText(tr("在线人数:%1").arg(ui->usrTblWidget->rowCount()));
}
QString Widget::getIP()
{
QList<QHostAddress> list = QNetworkInterface::allAddresses();
foreach (QHostAddress addr, list) {
if(addr.protocol() == QAbstractSocket::IPv4Protocol)
return addr.toString();
}
return 0;
}
QString Widget::getUsr()
{
return uName;
}
QString Widget::getMsg()
{
QString msg = ui->msgTxtEdit->toHtml();
ui->msgTxtEdit->clear();
ui->msgTxtEdit->setFocus();
return msg;
}
void Widget::on_sendBtn_clicked()
{
sndMsg(Msg);
}
void Widget::getFileName(QString name)
{
fileName = name;
sndMsg(FileName);
}
void Widget::on_sendTBtn_clicked()
{
if(ui->usrTblWidget->selectedItems().isEmpty())
{
QMessageBox::warning(0, tr("选择用户"),tr("请先选择目标用户!"), QMessageBox::Ok);
return;
}
srv->show();
srv->initSrv();
}
void Widget::hasPendingFile(QString usrname, QString srvaddr,QString clntaddr, QString filename)
{
QString ipAddr = getIP();
if(ipAddr == clntaddr)
{
int btn = QMessageBox::information(this,tr("接受文件"),tr("来自%1(%2)的文件:%3,是否接收?").arg(usrname).arg(srvaddr).arg(filename),QMessageBox::Yes,QMessageBox::No);
if (btn == QMessageBox::Yes) {
QString name = QFileDialog::getSaveFileName(0,tr("保存文件"),filename);
if(!name.isEmpty())
{
Client *clnt = new Client(this);
clnt->setFileName(name);
clnt->setHostAddr(QHostAddress(srvaddr));
clnt->show();
}
} else {
sndMsg(Refuse, srvaddr);
}
}
}
void Widget::on_fontCbx_currentFontChanged(const QFont &f)
{
ui->msgTxtEdit->setCurrentFont(f);
ui->msgTxtEdit->setFocus();
}
void Widget::on_sizeCbx_currentIndexChanged(const QString &arg1)
{
ui->msgTxtEdit->setFontPointSize(arg1.toDouble());
ui->msgTxtEdit->setFocus();
}
void Widget::on_boldTBtn_clicked(bool checked)
{
if(checked)
ui->msgTxtEdit->setFontWeight(QFont::Bold);
else
ui->msgTxtEdit->setFontWeight(QFont::Normal);
ui->msgTxtEdit->setFocus();
}
void Widget::on_italicTBtn_clicked(bool checked)
{
ui->msgTxtEdit->setFontItalic(checked);
ui->msgTxtEdit->setFocus();
}
void Widget::on_underlineTBtn_clicked(bool checked)
{
ui->msgTxtEdit->setFontUnderline(checked);
ui->msgTxtEdit->setFocus();
}
void Widget::on_colorTBtn_clicked()
{
color = QColorDialog::getColor(color,this);
if(color.isValid()){
ui->msgTxtEdit->setTextColor(color);
ui->msgTxtEdit->setFocus();
}
}
void Widget::curFmtChanged(const QTextCharFormat &fmt)
{
ui->fontCbx->setCurrentFont(fmt.font());
if (fmt.fontPointSize() < 8) {
ui->sizeCbx->setCurrentIndex(4);
} else {
ui->sizeCbx->setCurrentIndex(ui->sizeCbx->findText(Q
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本程序通过Qt 5.10.1开发,编译环境默认msvc2017,数据库为sqlite,数据库文件包含在其中了,用户需要自行下载sqlite。程序主界面为登录界面,有简单的管理员和用户登录功能。登陆后根据不同用户进入不同用户名的界面进行操作。程序包含一个生成字符的MD5和根据路径读文件生成MD5的功能,也有一个输入数字通过RSA加解密的功能。 MD5和RSA实现较为简单,但是用户可以根据自己的需要去进行修改,毕竟已经在Qt实现了,代码也浅显易懂。 注意:并未实现直接加密聊天消息的功能,也不能特别智能地验证完整性,这些功能用户需自行实现,本程序仅仅提供一个方便的平台。 本人保证程序在最新系统下正常运行,不会像其他程序是用qt4制作的。 程序绝大多数界面通过ui设计师制作,浅显易懂。
资源推荐
资源详情
资源评论
收起资源包目录
聊天软件.rar (49个子文件)
MyselfQQ
MyselfQQ.pro 800B
qtrsa.cpp 1KB
server.ui 2KB
images
lswh.png 14KB
ymrl.png 12KB
qmnn.png 12KB
wy.png 8KB
send.png 758B
jj.png 15KB
Cherry.png 14KB
italic.png 1KB
color.png 960B
dr.png 13KB
qq.png 10KB
clear.png 1KB
bold.png 2KB
spqy.png 9KB
save.png 1KB
under.png 1KB
Thumbs.db 47KB
widget.ui 12KB
drawer.cpp 6KB
rsa.h 4KB
widget.cpp 9KB
server.h 974B
client.h 934B
admin.cpp 572B
login.h 411B
MyselfQQ.pro.user.2.7pre1 17KB
images.qrc 670B
admin.h 345B
MyselfQQ.pro.user.fbb11d5 23KB
md5_check.h 504B
login.ui 2KB
qtrsa.h 375B
server.cpp 4KB
client.cpp 3KB
login.cpp 2KB
MyselfQQ.pro.user.d900b1b 18KB
md5_check.cpp 3KB
main.cpp 294B
drawer.h 1024B
admin.ui 1KB
MyselfQQ.pro.user 23KB
widget.h 2KB
qtrsa.ui 2KB
client.ui 2KB
md5_check.ui 5KB
chat.db 8KB
共 49 条
- 1
资源评论
吉法师、
- 粉丝: 24
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功