第一篇博客,来划划水
最好的排版就是没有排版(我懒)哈哈
主要功能
(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