基于QT和UDP Socket实现的即时通信软件

primadonna

发布日期: 2018-12-13 09:31:56 浏览量: 1052
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

摘 要

随着计算机应用技术的快速发展和日益普及,网络也遍及到我们生活的每个角落,为我们的学习和工作带来极大的方便。现很多人都使用网络通讯软件来进行聊天、交流,这种软件极大地缩短了人与人之间的沟通距离,使人们能够随时随地的进行交流。因此,一个即时通讯软件的设计是有必要的。

而本设计是基于Qt的开发平台上开发的一款即时通讯软件,通过网络编程SOCKET函数以实现同局域网内的文字传输。

关键词:通讯软件;网络编程;文字传输

第一章 设计内容

设计一个类似QQ的聊天软件,实现在同一局域网内不同用户之间的即时通信,程序具体功能有:

  • sqlite3数据库插入用户表

  • 登录界面:数据库验证登录

  • 用户主界面:数据库匹配用户好友列表

  • 聊天界面:在同一局域网内采用UDP的方式实现即时通信

  • 聊天记录以文件“.txt”的形式保存

第二章 总体设计

2.1 模块化设计

为实现系统功能,本程序主要分为四个模块。他们分别是:登录界面、用户主界面、好友列表界面、聊天界面。这四个模块是通过主函数实例化一个不显示的空用户主界面,在用户主界面的构造函数里还会实例化一个登录界面,当登录界面用户登录成功后,用户主界面转为显示状态并更新登录的用户信息(显示登录账号,更新用户好友列表),双击对应好友就可弹出聊天窗口,实现即时聊天。

主函数(main)

  1. // 实例化用户主界面
  2. MainWindow
  3. mainwin

登录界面类(logonscreen)

  1. // 构造函数
  2. LogonScreen(QWidget *parent = 0);
  3. // 创建数据库连接
  4. createConnection();
  5. // 创建用户表,添加可登陆用户
  6. createTable();
  7. // 查询用户表,显示所有用户
  8. selectTable();
  9. // 验证登录信息
  10. verify(const Qstring, const QString);
  11. // 登录按键的槽
  12. on_pushButton_login_clicked();
  13. // 退出按键的槽
  14. on_pushButton_close_clicked();
  15. // 自定义用户登录信号,向用户主界面传输当前登录账号值
  16. user_signal(QString value);

用户主界面类(mainwindow)

  1. // 构造函数
  2. MainWindow(QWidget *parent = 0);
  3. // 创建数据库连接
  4. createConnection();
  5. // 匹配用户好友,更新好友列表
  6. matchUserFriend();
  7. // 注销按钮的槽,返回登录界面
  8. on_pushButton_quit_clicked();
  9. // 获取用户登录信号响应的槽
  10. getUserValue(QString value);
  11. // 鼠标移动事件,单击移动界面
  12. mouseMoveEvent(QMouseEvent *event);

好友列表界面类(userwidget)

  1. // 原构造函数
  2. userwidget(QWidget *parent = 0);
  3. // 构造函数的重载
  4. userwidget(int receive_port,QString send_ip ,int send_port,QString send_account,QWidget *parent = 0);
  5. // 鼠标双击事件
  6. mouseDoubleClickEvent(QMouseEvent *event);

聊天界面类(chatwindow)

  1. // 原构造函数
  2. ChatWindow(QWidget *parent = 0);
  3. // 构造函数的重载
  4. ChatWindow(int receive_port,QString send_ip,int send_port,QString send_account,QWidget *parent = 0);
  5. // 键盘按下事件(ctrl+Enter)
  6. keyPressEvent(QKeyEvent *event);
  7. // 键盘释放事件
  8. keyReleaseEvent(QKeyEvent *event);
  9. // udp数据报接收
  10. processPendingDatagram();
  11. // 发送按钮的槽,发送udp数据报
  12. on_pushButton_send_clicked();
  13. // 关闭按钮的槽,关闭窗口
  14. on_pushButton_close_clicked();
  15. // 聊天记录按钮的槽,显示隐藏的界面
  16. on_pushButton_chatdata_toggled(bool checked);

2.2 程序运行示意图

第三章 详细设计

3.1 登录界面设计

3.1.1 登录界面UI设计

3.1.2 登录界面类设计

在登录界面类的构造函数里,会做连接sqlite3数据库,创建用户表和查询用户表并显示查询结果于调试窗口的操作。当用户在登录界面输入账号时,就会触发QT的自动补全功能(QCompleter),补全内容为在查询用户表时记录的用户账号(QStringList),方便用户输入体验。当用户输入密码时,lineEdit_password里的值会以密码的形式显示(setEchoMdoe)。用户键入完成,点击登录按钮,调试窗口显示键入内容,并调用verify(account, password)函数,把键入的账号密码作为数据库查询的where条件。如果查询结果存在,则发送accept()信号允许登录,并且还会发送一个自定义的emit user_signal(account)信号给用户主界面,传入当前登录账号值,作为主界面更新该用户好友列表的判断依据;否则,弹出一个dialog提示账号或密码错误。

3.2 用户主界面设计

3.2.1 用户主界面UI设计

3.2.2 用户主界面类设计

当实例化用户主界面时,主界面是不会show() 出来的,用户主界面类构造函数首先会实例化一个登录界面类的指针对象。然后,关联(connect)这个对象的自定义信号user_signal(account),使用户主界面收到这个信号时,能转到槽getUsrValue(QString),获取信号传进来的当前登录账号值。接着,显示登录界面,等待用户在登录界面的操作。最后,用户主界面会等待登录界面的用户登录成功后的Accepted信号,如果收到Accepted信号,主界面show() 出来,并且调用matchUserFriend()函数,匹配当前登录账号的好友列表。

更新好友列表的功能实现是通过在用户主界面的toolBox部件的page_friend里添加一个垂直布局(QBoxLayout),然后在matchUserFriend()函数里查询数据库里的用户表,查到一个好友则在垂直布局里实例化一个QT设计师类userwidget的指针对象。

3.3 好友列表界面设计

3.3.1 好友列表UI界面

3.3.2 好友列表类设计

这个类是在用户主界面matchUserFriend()函数里实例化使用的,结果是会在用户主界面的toolBox部件里的好友列表显示出来。因为要实现鼠标双击这个类(好友)就会弹出和这个好友的聊天窗口。所以这时候就需要考虑这个聊天窗口的接收UDP数据报的绑定端口和发送UDP数据报的目标IP、目标端口。为要解决这个问题,我这个类使用了构造函数的重载,在实例化该类的过程中同时传入接收端口、发送目标IP、发送目标端口和发送目标的名字。

好友列表类重载的构造函数主要做记录传入接收端口、发送目标IP、发送目标端口和发送目标的账号,并根据传进来的发送目标的账号从QT资源文件里查找对应的头像、昵称和签名。最后在鼠标双击事件里再用同样的方法把这些值传进聊天窗口界面。

3.4 聊天界面设计

3.4.1 聊天界面UI设计

3.4.2 聊天界面类设计

聊天界面类重载的构造函数,首先记录从好友列表类传进来的接收端口、发送目标IP、发送目标端口和发送目标的账号。然后隐藏聊天记录的textEdit部件,调整窗口的大小。最后绑定接收UDP数据包的端口和IP,关联QudpSocket::readyRead信号,当收到UDP数据报时,触发槽processPendingDatagram(),使收到的数据显示在listWidget上,并写入名为发送对象的txt文件里作为聊天记录保存起来。

发送按钮的槽函数,把当前时间(QDateTime::currentDateTime())和发送内容里(textEdit里面的数据)一起以UDP数据报发送出去,同时也写入到对应txt文件里面。

聊天记录按钮的槽函数,点击聊天记录按钮,检查按钮当前状态,如果按钮checked值为true,则显示隐藏的textEdit,并重新调整聊天界面大小,textEdit里面的值为从对应txt文件里读取的全部内容。

第四章 调试与测试

4.1 调试过程中的主要问题

  • 用户登录成功后,登录界面类的当前登录值怎么传进用户主界面?

    最后的解决方法是在用户主界面实例化登录界面指针对象,然后使用信号和槽传输登录账号值。

  • 用户主界面收到登录界面发来的信号后,已经知道当前登录账号了,怎么在该用户好友列表显示出来?

    最后的解决办法是新建QT设计师类(好友列表类),查询数据库,查到一个实例化一个好友列表类指针对象到toolBox部件里的垂直布局里。

  • 鼠标双击好友列表里的一个好友,弹出聊天窗口,聊天窗口的UDP数据报的接收端口和发送IP、发送端口的值怎么获取?

    最后解决办法是通过构造函数的重载,在实例化的过程中传进对应参数。

4.2 具体测试过程

4.2.1 登录界面

4.2.2 用户主界面

4.2.3 聊天界面

5 心得体会

通过这次课程设计,我学会了使用Qt制作一个简易的聊天工具,学到了Qt的UI布局、数据库操作、多界面的切换、信号与槽、socket编程、UDP通讯以及文件操作等,希望以后能进一步的深造学习。

参考文献

[1] 陈维兴 林小茶, C++面向对象程序设计教程(第3版). 北京: 清华大学出版社, 2009年5月

[2] 闫锋欣 曾泉人 张志强 译, C++ GUI Qt4 编程(第2版). 电子工业出版社, 2013年5月

[3] 金大颐 翻译:张红艳, Qt5开发实践. 北京: 人民邮电出版社, 2015年9月

上传的附件 cloud_download 基于QT和UDP Socket实现的即时通信软件.7z ( 1.71mb, 32次下载 )
error_outline 下载需要5点积分

发送私信

生活就像骑自行车,只有不断前进,才能保持平衡

17
文章数
15
评论数
最近文章
eject