效果展示
本次项目采用的是TCP传输文件,UDP实现聊天以及聊天状态的反馈。
一、首先运行程序会进入到这样一个会话界面,也就是新加入一个用户,新加入的用户会在右侧显示其用户名、主机名和IP地址,在消息记录框中也会提示在线信息。
二、消息字体样式、字体大小、加粗、斜体、下划线、颜色的效果展示。
三、进行文件传输。
1. 进行文件传输前要先从右侧列表选择传输的对象,然后选择传输的文件。
2. 文件选择后会显示将要发送的文件名,即可点击发送。
3. 发送端点击发送后,接收端会弹出是否接收文件的提示框,然后进行选择。选择接收后会再次弹出保存文件的对话框,选择保存路径,就完成了文件的传输。文章来源:https://www.toymoban.com/news/detail-511050.html
四、保存聊天记录会弹出保存文件对话框选择保存路径,输入保存文件名即可,这里保存聊天记录和清空聊天消息框内容就不做展示了,直接上代码。文章来源地址https://www.toymoban.com/news/detail-511050.html
具体实现代码
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTextCharFormat>
class QUdpSocket;
class TcpServer;
namespace Ui {
class Widget;
}
enum MessageType{Message, NewParticipant, ParticipantLeft, FileName, Refuse};
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void newParticipant(QString userName,QString localHostName, QString ipAddress); //添加新用户加入
void participantLeft(QString userName,QString localHostName, QString time); //用户离开
void sendMessage(MessageType type, QString serverAddress=""); //发送UDP数据
QString getIP(); //获取IP
QString getUserName(); //获取用户名
QString getMessage(); //获取用户聊天信息
void hasPendingFile(QString userName, QString serverAddress,QString clientAddress, QString fileName);//判断接收文件
bool saveFile(const QString& fileName); //保存文件
void closeEvent(QCloseEvent *); //关闭事件
private:
Ui::Widget *ui;
QUdpSocket *udpSocket;
qint16 port;
QString fileName;
TcpServer *server;
QColor color;
public slots:
void processPendingDatagrams(); //接收UDP数据
void on_sendButton_clicked(); //发送
void getFileName(QString); //获取文件名
void on_sendToolBtn_clicked(); //传输文件发送
void on_fontComboBox_currentFontChanged(QFont f); //更改字体
void on_sizeComboBox_currentIndexChanged(QString ); //更改字体大小
void on_boldToolBtn_clicked(bool checked); //加粗
void on_italicToolBtn_clicked(bool checked); //倾斜
void on_underlineToolBtn_clicked(bool checked); //下划线
void on_colorToolBtn_clicked(); //颜色设置
void currentFormatChanged(const QTextCharFormat &format);
void on_saveToolBtn_clicked(); //保存聊天记录
void on_clearToolBtn_clicked(); //清空记录
void on_exitButton_clicked(); //退出
};
#endif // WIDGET_H
widget.cpp (主界面具体功能)
#include "widget.h"
#include "ui_widget.h"
#include <QUdpSocket>
#include <QHostInfo>
#include <QMessageBox>
#include <QScrollBar>
#include <QDateTime>
#include <QNetworkInterface>
#include <QProcess>
#include "tcpserver.h"
#include "tcpclient.h"
#include <QFileDialog>
#include <QColorDialog>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowIcon(QPixmap(":/C:/Users/liuqy/Desktop/qq.png"));
//创建UDP套接字,并初始化
udpSocket = new QUdpSocket(this);
port = 45454;
udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
sendMessage(NewParticipant);
//创建TCP套接字
server = new TcpServer(this);
connect(server, SIGNAL(sendFileName(QString)), this, SLOT(getFileName(QString)));
connect(ui->messageTextEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)),
this, SLOT(currentFormatChanged(const QTextCharFormat)));
}
Widget::~Widget()
{
delete ui;
}
//发送UDP数据
void Widget::sendMessage(MessageType type, QString serverAddress)
{
QByteArray data;
QDataStream out(&data, QIODevice::WriteOnly);
QString localHostName = QHostInfo::localHostName();
QString address = getIP();
out << type << getUserName() << localHostName;
switch(type)
{
case Message :
if (ui->messageTextEdit->toPlainText() == "") {
QMessageBox::warning(0,tr("警告"),tr("发送内容不能为空"),QMessageBox::Ok);
return;
}
out << address << getMessage();
ui->messageBrowser->verticalScrollBar()
->setValue(ui->messageBrowser->verticalScrollBar()->maximum());
break;
case NewParticipant :
out << address;
break;
到了这里,关于基于qt的简易聊天实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!