当前位置:   article > 正文

基于qt的简易聊天实现_qt 把文件显示到聊天窗口

qt 把文件显示到聊天窗口

效果展示

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

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

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

 三、进行文件传输。

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

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

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

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

具体实现代码

widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QTextCharFormat>
  5. class QUdpSocket;
  6. class TcpServer;
  7. namespace Ui {
  8. class Widget;
  9. }
  10. enum MessageType{Message, NewParticipant, ParticipantLeft, FileName, Refuse};
  11. class Widget : public QWidget
  12. {
  13. Q_OBJECT
  14. public:
  15. explicit Widget(QWidget *parent = 0);
  16. ~Widget();
  17. protected:
  18. void newParticipant(QString userName,QString localHostName, QString ipAddress); //添加新用户加入
  19. void participantLeft(QString userName,QString localHostName, QString time); //用户离开
  20. void sendMessage(MessageType type, QString serverAddress=""); //发送UDP数据
  21. QString getIP(); //获取IP
  22. QString getUserName(); //获取用户名
  23. QString getMessage(); //获取用户聊天信息
  24. void hasPendingFile(QString userName, QString serverAddress,QString clientAddress, QString fileName);//判断接收文件
  25. bool saveFile(const QString& fileName); //保存文件
  26. void closeEvent(QCloseEvent *); //关闭事件
  27. private:
  28. Ui::Widget *ui;
  29. QUdpSocket *udpSocket;
  30. qint16 port;
  31. QString fileName;
  32. TcpServer *server;
  33. QColor color;
  34. public slots:
  35. void processPendingDatagrams(); //接收UDP数据
  36. void on_sendButton_clicked(); //发送
  37. void getFileName(QString); //获取文件名
  38. void on_sendToolBtn_clicked(); //传输文件发送
  39. void on_fontComboBox_currentFontChanged(QFont f); //更改字体
  40. void on_sizeComboBox_currentIndexChanged(QString ); //更改字体大小
  41. void on_boldToolBtn_clicked(bool checked); //加粗
  42. void on_italicToolBtn_clicked(bool checked); //倾斜
  43. void on_underlineToolBtn_clicked(bool checked); //下划线
  44. void on_colorToolBtn_clicked(); //颜色设置
  45. void currentFormatChanged(const QTextCharFormat &format);
  46. void on_saveToolBtn_clicked(); //保存聊天记录
  47. void on_clearToolBtn_clicked(); //清空记录
  48. void on_exitButton_clicked(); //退出
  49. };
  50. #endif // WIDGET_H

widget.cpp (主界面具体功能)

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QUdpSocket>
  4. #include <QHostInfo>
  5. #include <QMessageBox>
  6. #include <QScrollBar>
  7. #include <QDateTime>
  8. #include <QNetworkInterface>
  9. #include <QProcess>
  10. #include "tcpserver.h"
  11. #include "tcpclient.h"
  12. #include <QFileDialog>
  13. #include <QColorDialog>
  14. Widget::Widget(QWidget *parent) :
  15. QWidget(parent),
  16. ui(new Ui::Widget)
  17. {
  18. ui->setupUi(this);
  19. setWindowIcon(QPixmap(":/C:/Users/liuqy/Desktop/qq.png"));
  20. //创建UDP套接字,并初始化
  21. udpSocket = new QUdpSocket(this);
  22. port = 45454;
  23. udpSocket->bind(port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
  24. connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
  25. sendMessage(NewParticipant);
  26. //创建TCP套接字
  27. server = new TcpServer(this);
  28. connect(server, SIGNAL(sendFileName(QString)), this, SLOT(getFileName(QString)));
  29. connect(ui->messageTextEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)),
  30. this, SLOT(currentFormatChanged(const QTextCharFormat)));
  31. }
  32. Widget::~Widget()
  33. {
  34. delete ui;
  35. }
  36. //发送UDP数据
  37. void Widget::sendMessage(MessageType type, QString serverAddress)
  38. {
  39. QByteArray data;
  40. QDataStream out(&data, QIODevice::WriteOnly);
  41. QString localHostName = QHostInfo::localHostName();
  42. QString address = getIP();
  43. out << type << getUserName() << localHostName;
  44. switch(type)
  45. {
  46. case Message :
  47. if (ui->messageTextEdit->toPlainText() == "") {
  48. QMessageBox::warning(0,tr("警告"),tr("发送内容不能为空"),QMessageBox::Ok);
  49. return;
  50. }
  51. out << address << getMessage();
  52. ui->messageBrowser->verticalScrollBar()
  53. ->setValue(ui->messageBrowser->verticalScrollBar()->maximum());
  54. break;
  55. case NewParticipant :
  56. out << address;
  57. break;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/686408
推荐阅读
相关标签
  

闽ICP备14008679号