基于Qt简单聊天程序-具体步骤-详细注释_第1页
基于Qt简单聊天程序-具体步骤-详细注释_第2页
基于Qt简单聊天程序-具体步骤-详细注释_第3页
基于Qt简单聊天程序-具体步骤-详细注释_第4页
基于Qt简单聊天程序-具体步骤-详细注释_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于qt编写的cs模型的简单聊天程序开发Qt工具一.创建工程1,选择新建工程2 选择Qt4 Gui Application工程。(带UI界面编辑的工程)3 取工程名 C_S_Socket。路径随意,不要有任何中文 Next4 默认即可,Next(这是为此次工程选择要添加的头文件。我们不需要其他的功能。默认)5 Base class 选择QDialog。Class name 改 MainDlg。 Next(我们是基于Qt界面编程的嘛。所以就选QDialog Qt窗口类噻)6 Finish 完成(这里是编辑器告诉我们生成了如下文件)二.画界面1 点击maindlg.ui 进入主界面窗体设计成如下2

2、 设置各个控件的对象名(不能同名,系统用对象名找到控件。命名规范方便自己识别)  服务器单选框:radioButton_Server客户端单选框:radioButton_ClientIP地址框:lineEdit_Address用户名框:lineEdit_Name离开按钮:wayButton进入按钮:enterButton3 创建一个窗体类,用于发送接收信息的窗体选择窗体样式。修改类名 chat,下一步完成(chat:聊天的意思)4 第二窗体设计如下窗体控件对象名如下显示信息框:showMessageEdit输入信息框:writeMessageEdit用户名显示列表:onli

3、neMessageList关于按钮:aboutButton发送按钮:sendButton界面等操作到此结束!2013年12月8日16:47:31代码贴在后面。注意:代码写完后编译会出错!在C_S_S 工程文件的最后加上 QT += network 编译就不会出错了 (不知道什么意思,难道是为Qt加入网络的支持?)代码maindlg.h#ifndef MAINDLG_H#define MAINDLG_H#include <QDialog>namespace Ui class MainDlg;class MainDlg : public QDialog Q_OBJEC

4、Tpublic: MainDlg(QWidget *parent = 0); MainDlg(); bool m_bool_server;/判断选择的方式protected: void changeEvent(QEvent *e);signals:/信号 void showChatWindow(); void sendEnterMessage(QString, QString);private: Ui:MainDlg *ui;public slots:/槽 void enterSlot(); void OnSelectServer(); void OnSelectClient();#endif

5、 / MAINDLG_Hmaindlg.cpp#include "maindlg.h"#include "ui_maindlg.h"#include <QMessageBox>MainDlg:MainDlg(QWidget *parent) : QDialog(parent), ui(new Ui:MainDlg) ui->setupUi(this); /离开按钮点击事件的连接 connect(ui->awayButton, SIGNAL(clicked(),qApp, SLOT(quit(); /进入按钮点击事件的连接 conn

6、ect(ui->enterButton, SIGNAL(clicked(), this, SLOT(enterSlot(); /选择服务器单选按钮点击事件的连接 connect(ui->radioButton_Server, SIGNAL(clicked(), this, SLOT(OnSelectServer(); /选择客户端单选按钮点击事件的连接 connect(ui->radioButton_Client, SIGNAL(clicked(), this, SLOT(OnSelectClient();MainDlg:MainDlg() delete ui;/* *选择服

7、务器单选按钮的点击消息 */void MainDlg:OnSelectServer() m_bool_server = true; ui->lineEdit_Address->setText(""); if (ui->lineEdit_Name->text().isEmpty()| ui->lineEdit_Name->text()="Client") ui->lineEdit_Name->setText("Server");/* *选择客户端单选按钮的点击消息 */void MainD

8、lg:OnSelectClient() m_bool_server = false; ui->lineEdit_Address->setText(""); if (ui->lineEdit_Name->text().isEmpty() | ui->lineEdit_Name->text()="Server") ui->lineEdit_Name->setText("Client");void MainDlg:changeEvent(QEvent *e) QDialog:

9、changeEvent(e); switch (e->type() case QEvent:LanguageChange: ui->retranslateUi(this); break; default: break; void MainDlg:enterSlot() if (ui->lineEdit_Name->text().isEmpty() QMessageBox mess; mess.setFont(QFont("Sans Serif", 12, 50); mess.warning(this, QString:fromLocal8Bit(&q

10、uot;出错"), QString:fromLocal8Bit("<font size=5>请输入正确的昵称,谢谢!</font>"); return; /发射信号 emit sendEnterMessage(ui->lineEdit_Name->text(), ui->lineEdit_Address->text(); emit showChatWindow();chat.h#ifndef CHAT_H#define CHAT_H#include <QDialog>#include "main

11、dlg.h"#include <QDateTime>#include <QtNetwork/QTcpServer>/Tcp协议的服务器监听连接类#include <QtNetwork/QTcpSocket>/Tcp协议的Socket类#include <QtNetwork/QHostAddress>namespace Ui class chat;class chat : public QDialog Q_OBJECTpublic: chat(QWidget *parent = 0); chat(); void socketServer(

12、);/启动服务器监听连接 void socketClient(QString host);/与服务器连接 MainDlg *p_my_dlg;/主界面指针 int port;/端口号 QString m_str_userName;/用户名 bool m_bool_server;/是服务器还是客户端 /Tcp协议的服务器Socket类 QTcpServer *m_p_server;/Tcp协议的服务器监听连接类 QTcpSocket *m_p_serverSocket;/服务器Socket QTcpSocket *m_p_clientSocket;/客户端Socket QDateTime now

13、DateTime;/时间protected: void changeEvent(QEvent *e);private: Ui:chat *ui;public slots:/槽 void showAndHideSlot();/显示本窗体关闭主窗体 void changeButtonStateSlot();/如果输入框为空,则发送按钮不能使用 void createAboutSlot();/关于信息 void enterSlot(QString name, QString host);/选择服务器或客户端 void newConnectionSlot();/连接来时,服务器与客户端创建连接 voi

14、d newDataSlot();/有数据来时 void deleNameSlot();/ void addSlot(); void appendMessageSlot();#endif / CHAT_Hchat.cpp#include "chat.h"#include "ui_chat.h"#include <QMessageBox>chat:chat(QWidget *parent) : QDialog(parent), ui(new Ui:chat) ui->setupUi(this);/设置 UI设计的界面的控件 m_p_serv

15、er = NULL; m_p_serverSocket = NULL; m_p_clientSocket = NULL; p_my_dlg = new MainDlg;/主界面 p_my_dlg->show(); /显示主界面 /* *连接信号 */ /主窗体中显示本窗体信号 connect(p_my_dlg, SIGNAL(showChatWindow(), this, SLOT(showAndHideSlot(); connect(p_my_dlg, SIGNAL(sendEnterMessage(QString , QString), this,SLOT(enterSlot(QSt

16、ring , QString ); connect(ui->writeMessageEdit, SIGNAL(textChanged(), this, SLOT(changeButtonStateSlot(); connect(ui->aboutButton, SIGNAL(clicked(), this, SLOT(createAboutSlot(); connect(ui->sendButton, SIGNAL(clicked(), this, SLOT(appendMessageSlot();chat:chat() delete ui;/本窗体创建时由系统自动调用voi

17、d chat:changeEvent(QEvent *e) QDialog:changeEvent(e); switch (e->type() case QEvent:LanguageChange: ui->retranslateUi(this);/设置本船体的一些属性 break; default: break; /显示关闭主窗体,显示本窗体void chat:showAndHideSlot() delete p_my_dlg; this->show();/显示关于信息void chat:createAboutSlot() QMessageBox mess; mess.se

18、tFont(QFont("Sans Serif", 12, 50); mess.warning(this, QString:fromLocal8Bit("关于"), QString:fromLocal8Bit("<font size=5>基于qt编写的cs模型的简单聊天程序</font>");/根据选择p_my_dlg->m_bool_server 选择相应操作void chat:enterSlot(QString name, QString host) port = 22222;/设置Socket端口号

19、 m_bool_server = p_my_dlg->m_bool_server;/选择状态传送 if (m_bool_server) socketServer(); else socketClient(host); ui->sendButton->setDisabled(false);/发送按钮不能使用 m_str_userName = name; ui->onlineMessageList->addItem(name);/如果输入框为空,则发送按钮不能使用void chat:changeButtonStateSlot() bool boo_dis = ui-&

20、gt;writeMessageEdit->toPlainText().isEmpty(); ui->sendButton->setDisabled(boo_dis);/发送信息void chat:appendMessageSlot() /获取输入框内容,然后清空 QString content = ui->writeMessageEdit->toPlainText(); if (content.isEmpty() QMessageBox:warning(this, "出错", QString:fromLocal8Bit("发送的内容不

21、能为空"); return; nowDateTime = QDateTime:currentDateTime();/获取时间 /按指定格式拼合字符串 ui->showMessageEdit->append( QString("n%1 %2 %3n%4") .arg(nowDateTime.toString("yyyy-MM-dd hh:mm:ss") .arg(m_str_userName) .arg(QString:fromLocal8Bit("说道:") .arg(content) ); QDataStrea

22、m out;/流 if (m_bool_server) out.setDevice(m_p_serverSocket); else out.setDevice(m_p_clientSocket); int mark = 0;/普通信息代号 /发送代号+用户名=信息 out << mark; out << m_str_userName << content; ui->writeMessageEdit->clear();/创建服务器Socket 监听连接void chat:socketServer() m_p_server = new QTcpSer

23、ver(this);/创建TCP 服务器用于监听socket连接 m_p_serverSocket = new QTcpSocket(this);/创建套接字 m_p_server->listen(QHostAddress:Any, port);/监听 socket连接 /设置 有新连接信号,触发函数 connect(m_p_server, SIGNAL(newConnection(), this, SLOT(newConnectionSlot();/有新的连接时。槽void chat:newConnectionSlot() m_p_serverSocket = m_p_server-&

24、gt;nextPendingConnection(); /有数据来时, connect(m_p_serverSocket, SIGNAL(readyRead(), this, SLOT(newDataSlot(); connect(m_p_serverSocket, SIGNAL(disconnected(), this, SLOT(deleNameSlot();/创建客户端Socket 与服务器连接void chat:socketClient(QString host) m_p_clientSocket = new QTcpSocket(this); m_p_clientSocket->

25、;connectToHost(host, port); /当成功连接时,名字list框中加入用户名 connect(m_p_clientSocket, SIGNAL(connected(), this, SLOT(addSlot(); connect(m_p_clientSocket, SIGNAL(readyRead(), this, SLOT(newDataSlot(); connect(m_p_clientSocket, SIGNAL(disconnected(), this, SLOT(deleNameSlot();/在名字list框中加入用户名void chat:addSlot()

26、QString content; QDataStream out(m_p_clientSocket);/Qt socket 数据传输的方式 int mark = 11; /把socket看成流使用 out << mark;/发送代号11+用户名, 告诉服务器,连接成功了, out << m_str_userName << content;/接收信息void chat:newDataSlot() int mark; QString hisName; QString content; QDataStream in;/流对象 if (m_bool_server) in.setDevice(m_p_serverSocket);/把服务器的Sokcet当成流 else in.setDevice(m_p_clientSocket);/把客户端的Sokcet当成流 in >> mark;/读取代号 / 如果代号是11,则是客户端加入。添加用户名 if (mark = 11) /addList in >> hisName >> content; i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论