基于qt的简易聊天实现

效果展示

本次项目采用的是TCP传输文件,UDP实现聊天以及聊天状态的反馈。

一、首先运行程序会进入到这样一个会话界面,也就是新加入一个用户,新加入的用户会在右侧显示其用户名、主机名和IP地址,在消息记录框中也会提示在线信息。

二、消息字体样式、字体大小、加粗、斜体、下划线、颜色的效果展示。

 三、进行文件传输。

1. 进行文件传输前要先从右侧列表选择传输的对象,然后选择传输的文件。

2. 文件选择后会显示将要发送的文件名,即可点击发送。

 3. 发送端点击发送后,接收端会弹出是否接收文件的提示框,然后进行选择。选择接收后会再次弹出保存文件的对话框,选择保存路径,就完成了文件的传输。

 四、保存聊天记录会弹出保存文件对话框选择保存路径,输入保存文件名即可,这里保存聊天记录和清空聊天消息框内容就不做展示了,直接上代码。

具体实现代码

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;

    
  • 9
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值