学习了Qt好长时间了,今天开始做聊天软件,在网上看了下被人做的,有点意思。不过它的功能有点简单,自己想扩展一下,主要增加的功能有;(下篇博客)
1、实现客户端之间的私聊,以及群聊;
2、传输文件;
3、发送表情符号,类似QQ那种功能。
4、增加数据库的操作
5、实现用户注册、登陆的功能。
一下是程序的截图:
程序源代码:
client.h
#ifndef CLIENT_H #define CLIENT_H #include <QWidget> #include <QTcpSocket> #include <QTextEdit> #include <QLineEdit> #include <QPushButton> class client : public QWidget { Q_OBJECT public: explicit client(QWidget *parent = 0); signals: private: QTextEdit *textEdit; QLineEdit *lineEdit; QPushButton *sendBtn; QPushButton *connectBtn; QTcpSocket *m_tcpsocket; QString userStr; private slots: void connectTcpServer(); void connectedServer(); void readMessage(); void sendMessage(); }; #endif // CLIENT_H
#include "client.h" #include <QHBoxLayout> #include <QHostAddress> client::client(QWidget *parent) : QWidget(parent) { userStr = QString(tr("张三")); textEdit = new QTextEdit; textEdit->setReadOnly(true); lineEdit = new QLineEdit; connectBtn = new QPushButton("连接服务器"); connect(connectBtn,SIGNAL(clicked()),this,SLOT(connectTcpServer())); sendBtn = new QPushButton("发送"); connect(sendBtn,SIGNAL(clicked()),this,SLOT(sendMessage())); QHBoxLayout *bottomlayout = new QHBoxLayout; bottomlayout->addWidget(connectBtn); bottomlayout->addWidget(sendBtn); QVBoxLayout *mainlayout = new QVBoxLayout; mainlayout->addWidget(textEdit); mainlayout->addWidget(lineEdit); mainlayout->addLayout(bottomlayout); setLayout(mainlayout); } void client::connectTcpServer() { m_tcpsocket = new QTcpSocket(this); m_tcpsocket->abort(); m_tcpsocket->connectToHost(QHostAddress::LocalHost,55555); connect(m_tcpsocket,SIGNAL(connected()),this,SLOT(connectedServer())); connect(m_tcpsocket,SIGNAL(readyRead()),this,SLOT(readMessage())); textEdit->append(tr("连接服务器......")+'\n'); connectBtn->setEnabled(false); } void client::connectedServer() { textEdit->append(tr("连接服务器成功!")+'\n'); } void client::readMessage() { QString string; QByteArray block = m_tcpsocket->readAll(); QDataStream in(block); in.setVersion(QDataStream::Qt_4_7); in>>string; textEdit->append(tr("用户有消息到来\n消息是:")+string+'\n'); } void client::sendMessage() { int type; type = 1; QString string = lineEdit->text(); QByteArray block; QDataStream out(&block,QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_7); out<<userStr; out<<type; out<<string; m_tcpsocket->write(block); lineEdit->clear(); }
#ifndef SERVER_H #define SERVER_H #include <QWidget> #include <QTcpSocket> #include <QtNetwork> #include <QTextEdit> #include <QLineEdit> #include <QPushButton> class server : public QWidget { Q_OBJECT public: explicit server(QWidget *parent = 0); signals: private: QTextEdit *textEdit; QLineEdit *lineEdit; QPushButton *sendBtn; QPushButton *startBtn; QTcpSocket *m_tcpsocket; QTcpServer *m_tcpserver; private slots: void startTcpServer(); void sendMessage(); void newConnect(); void readMessage(); }; #endif // SERVER_H
#include "server.h" #include <QHBoxLayout> server::server(QWidget *parent) : QWidget(parent) { textEdit = new QTextEdit; textEdit->setReadOnly(true); lineEdit = new QLineEdit; startBtn = new QPushButton("打开服务器"); connect(startBtn,SIGNAL(clicked()),this,SLOT(startTcpServer())); sendBtn = new QPushButton("发送"); connect(sendBtn,SIGNAL(clicked()),this,SLOT(sendMessage())); QHBoxLayout *bottomlayout = new QHBoxLayout; bottomlayout->addWidget(startBtn); bottomlayout->addWidget(sendBtn); QVBoxLayout *mainlayout = new QVBoxLayout; mainlayout->addWidget(textEdit); mainlayout->addWidget(lineEdit); mainlayout->addLayout(bottomlayout); setLayout(mainlayout); } void server::startTcpServer() { startBtn->setEnabled(false); m_tcpserver = new QTcpServer; m_tcpserver->listen(QHostAddress::Any,55555); connect(m_tcpserver,SIGNAL(newConnection()),this,SLOT(newConnect())); } void server::sendMessage() { QString string = lineEdit->text(); QByteArray block; QDataStream out(&block,QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_7); out<<string; m_tcpsocket->write(block); } void server::newConnect() { textEdit->append(tr("有用户链接...")+'\n'); m_tcpsocket = m_tcpserver->nextPendingConnection(); connect(m_tcpsocket,SIGNAL(readyRead()),this,SLOT(readMessage())); } void server::readMessage() { QString userstr; int type; QString string; QByteArray block = m_tcpsocket->readAll(); QDataStream in(block); in.setVersion(QDataStream::Qt_4_7); in>>userstr; in>>type; in>>string; textEdit->append(userstr+tr("用户有消息到来\n消息是:")+string+'\n'); }
#include <QApplication> #include "widget.h" #include "server.h" #include "client.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); //Widget w; //w.show(); //setcodec QTextCodec::setCodecForTr(QTextCodec::codecForName("system")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("system")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("system")); server s; s.show(); client c1; c1.show(); return a.exec(); }