基于Qt的局域网即时通讯工具(记录我的第一篇博客)

第一篇博客,来划划水

最好的排版就是没有排版(我懒)哈哈

 

主要功能

(1)用户可以验证登录;

(2)可以查看个人信息;

(3)用户可以注册账号;

(4)用户可以进行私聊;

(5)用户可以进行截图;

(6)用户可以更换个人头像;

(7)用户可以进行文件传输;

(8)用户可以保存聊天记录;

(9)可以向数据库注册用户信息;

(10)可以修改用户个人身份信息;

(11)用户可以发送文本聊天信息;

 

登陆界面

                                     

主界面

用户信息查看界面

私聊界面

                                

发送文件界面

              

 

部分原码展示

(1)登入系统

//连接数据库

QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );

db.setHostName( "127.0.0.1" );

db.setDatabaseName( "mychat" );

db.setUserName( "root" );

db.setPassword( "09098" );

bool ok = db.open();

if ( ok )

{

     QSqlQuery query( db );       //query查询与db连接

     QString str = QString( "select * from user" );

     query.exec( str );

     while( query.next() )//指向下一条记录

{

QString PAS = query.value(2).toString();   //密码

        QString USN = query.value(1).toString();   //账号

        if(!QString::compare(USN,usn))

         {

               if(PAS == pas)//密码正确

               {

                    this->close();

                    QString data = ui->userName->text();

                    emit userdata(data, a);  //向主窗口传参,用户名和头像

}}}}

(2)用户注册

//连接数据库

……

bool ok = db.open();//打开数据库

        if (ok)

        {

            qDebug() << "成功连接数据库";

            QSqlQuery query(db);      //query查询与db连接

            QString str = QString("select * from user");

            query.exec(str);

            while(query.next())//指向下一条记录

            {

                usnam = query.value(1).toString();

                if(!QString::compare(usnam,usNam))

                {

                    flag = 1;

                    break;

                }

            }

            if(flag == 0){

                str = QString("INSERT INTO user(username, password, question, answer) VALUES ('%1', '%2', '%3', '%4')").arg(usNam,passW, ques, answ);  //添加数据项

                query.exec(str);  //执行语句,并获取结果集

                QMessageBox:: StandardButton result = QMessageBox::information(this, "注册成功", "注册成功,请返回登录!", QMessageBox::Yes|QMessageBox::No);

(3)个人信息查看和修改

……//连接数据库

bool ok = db.open();

    if (ok)

    {

        QSqlQuery query(db); //query查询与db连接

        QString str = QString("select * from user where username = ‘1%’").arg(theUserName);

        query.exec(str);

        QString USN = query.value(1).toString();   //查询

        QString NAM = query.value(5).toString();

        ……

        ui->namelabel->setText("姓名:"+NAM);  //显示

        ……

}

//连接数据库

bool ok = db.open();

    if (ok)

    {

        QSqlQuery query(db); //query与db连接

        query.prepare("update user set name= ?,age=?,sex=?,address=?,phone=?,num=? where username=?");

        query.addBindValue(name);

        query.addBindValue(age);

        ……}

(4)登入系统,进入公共聊天

创建UDP套接字,并进行初始化:

udpSocket = new QUdpSocket(this);

port = 45454;

udpSocket -> bind( port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint );

connect ( udpSocket, SIGNAL ( readyRead() ), this, SLOT( processPendingDatagrams() ) );

新用户加入:

void MainWidget::newPeople( QString username , QString localHostName , QString ipAddress)

{

    if(userName != nullptr)

{

//根据用户名判断是否为新加入用户

bool isEmpty = ui -> userTableWidget -> findItems(userName, Qt::MatchExactly ) .isEmpty();

if(isEmpty)

        {

            QTableWidgetItem *user = new QTableWidgetItem ( username );

            QTableWidgetItem *host = new QTableWidgetItem ( localHostName );

            QTableWidgetItem *ip = new QTableWidgetItem ( ipAddress );

            //在用户栏加入新加入用户信息

            ui -> userTableWidget -> insertRow(0);

            ui -> userTableWidget -> setItem(0,0,user);

            ui -> userTableWidget -> setItem(0,1,host);

            ui -> userTableWidget -> setItem(0,2,ip);

            //显示新用户加入信息

            ui -> mesBrowser -> append(tr("%1 已上线!").arg( username ));

            ui -> userNumLabel -> setText( tr("在线人数:%1")

.arg(ui -> userTableWidget -> rowCount()));

            sendMessage(NewPeople);

}}}

5)用户私聊

sendMessage( PrivateChat );  //UDP广播私聊请求

服务器端:

tcpSocket = nullptr;   //通信套接字

tcpServer = nullptr;   //监听套接字

tcpServer = new QTcpServer( this );//指定父对象,用以自动回收空间

tcpServer -> listen( QHostAddress::Any, 8888);

connect( tcpServer, &QTcpServer::newConnection, [=](){

//取出建立好连接的套接字

tcpSocket = tcpServer -> nextPendingConnection();

……} );

connect( tcpSocket, &QTcpSocket::readyRead, [=](){

        //从通信套接字中取出内容

        QByteArray array = tcpSocket -> readAll();  //取出所有内容

        ……} );

客户端:

TcpSocket = nullptr;

//分配空间,指定父对象

TcpSocket = new QTcpSocket(this);

connect ( TcpSocket, &QTcpSocket::connected, [=]() {

      ui -> mestextBrowser -> setText( "成功建立连接,您已进入私聊!");

……});

//主动和服务器建立连接

TcpSocket -> connectToHost ( QHostAddress( ip ), port);

//发送信息

tcpSocket->write(Message.toUtf8().data());

(6)文件传输

服务器端:

tcpPort = 6666;

tcpServer = new QTcpServer( this );

connect( tcpServer, SIGNAL(newConnection() ), this, SLOT( sendMessage() ) );

//传输文件

clientConnection = tcpServer->nextPendingConnection();

connect( clientConnection, SIGNAL( bytesWritten( qint64 ) ),

this, SLOT ( updateClientProgress ( qint64 ) ) );

QDataStream sendOut(&outBlock, QIODevice::WriteOnly);  //发送文件流

客户端:

tcpClient = new QTcpSocket(this);

tcpPort = 6666;

//数据传输成功,readMessage接收处理数据

connect(tcpClient, SIGNAL(readyRead()), this, SLOT(readMessage()));  

Connect ( tcpClient, SIGNAL( error( QAbstractSocket::SocketError )),

this, SLOT( displayError( QAbstractSocket::SocketError ) ) );

 

界面参考:微信电脑版

参考:霍亚飞《Qt及Qt Quick开发实战精解》,北京航空航天大学出版社.2012

 

 

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读