Qt:一个能远程和别人聊天的高仿QQ程序,无需建立通信
动动小手,连接数据库就能完成,看似很难,实则也有点繁琐,哈哈哈哈哈。
一、登录界面
二、聊天界面
三、功能描述
- 首先可以注册账号;
- 可以登录不同的账号,记录当前登录的用户是谁;
- 双击左边好友列表即可与好友聊天;
- 在好友列表里可查看当前好友是否在线;
- 当点击好友时,可自动列出与该好友的聊天记录;
- 最主要时是,可以远程聊天;
四、实现原理
- 看着买的阿里服务器,没什么用处,所以就想着用数据库来弄点有意思的作品,其实整个实现过程就是对数据库的操作,登录啊、聊天都是从数据库拿数据,然后实时读取数据库信息,谁发给谁,做好细节,总体来说还是蛮有趣的。
- 接下来读者可以看一下实现的过程。
五、实现过程
- 连接数据库
有两种方法可以连接数据库
第一种为:MySQL
找了好久终于解决了,就是下载对应的数据库驱动就可以了,我使用的数据库版本为5.7的,知道你们懒得找,所以把下载好的驱动可以在百度网盘自行下载,5M左右。
百度网盘连接:https://pan.baidu.com/s/1llS64YSm5TcVNEiJlqFiSg
密码:ogej
之后就是把下载好的驱动放到两个文件夹中
到这里就可以去运行查看效果了
以下是连接数据库代码,可直接在main函数里测试:
//加几个头文件
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
//可直接在main函数里测试
void loadMySqlDriver() {
qDebug() << QSqlDatabase::drivers();
db.setHostName("服务器ip地址");
db.setPort(3306);
db.setDatabaseName("qq"); //数据库名字
db.setUserName("root"); //数据库用户名
db.setPassword("123456"); //数据库密码
db.open();
if(!db.open())
{
qDebug()<<"不能连接"<<"connect to mysql error"<<db.lastError().text();
return ;
}
else
{
qDebug()<<"连接成功"<<"connect to mysql OK";
}
}
第二种为:OBDC
如果你电脑就装有mysql数据库的话,那么运行mysql自带的应用程序进行查看以及安装
安装完之后,用小娜搜索ODBC,选择对应的位数进行打开
连接数据库代码:
void MainWindow::MySQL_Connect()
{
//可以把这句定义成全局变量,在其他窗口调用就声明为外部定义就可访问到了
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("服务器IP地址");
db.setPort(3306);
db.setUserName("服务器数据库的用户名");
db.setPassword("服务器数据库的密码");
db.setDatabaseName("刚才第一个选项的名字");
if ( !db.open()){
QMessageBox::information(this, "infor", "open failed");
}
else
qDebug()<<"连接成功";
}
- 登录功能
数据库查询:
void MainWindow::MySQL_Search()
{
//可以把这句定义成全局变量,在其他窗口调用就声明为外部定义就可访问到了
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
QSqlQuery result = db.exec(" select * from user");
//ODBC查询数据,可自己判断一下返回值是否为真,为真则查询到了,否则没有查询到
while(result.next()){
//打印查询到的数据
qDebug()<<result.value("user_name");
qDebug()<<result.value("user_password");
}
}
我自己的代码:
void MainWindow::MySQL_Search()
{
QSqlQuery result = db.exec(" select * from user");
//ODBC查询数据
bool ret = false;
if((ui->username_edit->text() != QString("")) && (ui->password_edit->text() != QString("")))
{
while(result.next()){
if((ui->username_edit->text() == result.value("user_name")) && (ui->password_edit->text() == result.value("user_password")) ){
Now_Sign_User = ui->username_edit->text();
chatwindow->show();
this->hide();
ret = true;
break;
}
}
if(!ret)
{
QMessageBox::information(this, "提示", "用户名或密码错误!");
}
}
else
{
QMessageBox::information(this, "提示", "用户名或密码不能为空!");
}
}
- 聊天实现
void ChatWindow::List_Chat_Data()
{
ui->recive_textEdit->clear();
//QSqlQuery result = db.exec("select * from data_chat order by data_id desc");//降序
QSqlQuery result = db.exec("select * from data_chat order by data_id asc");//升序
while(result.next()){
//如果查询到的数据是当前用户发给聊天用户的数据就用一种字体颜色追加到聊天窗口
if((Now_Sign_User == result.value("data_form_user").toString()) && (ui->chat_name->text() == result.value("data_to_user").toString()))
{
//组包字符串
QString insert_data = result.value("data_form_user").toString() + "->" + result.value("data_to_user").toString() + " " + result.value("data_time").toString();
QString insert_chat_data =result.value("data_chat").toString();
ui->recive_textEdit->append(insert_data);
ui->recive_textEdit->append("<font color=\"#0000FF\">"+insert_chat_data+"</font> "); //设置字体颜色
ui->recive_textEdit->append(" ");
}
//如果查询到的数据是当前用户收到聊天用户的数据就用一种字体颜色追加到聊天窗口
else if((Now_Sign_User == result.value("data_to_user").toString()) && (ui->chat_name->text() == result.value("data_form_user").toString()))
{
//组包字符串
QString insert_data = result.value("data_form_user").toString() + "->" + result.value("data_to_user").toString() + " " + result.value("data_time").toString();
QString insert_chat_data =result.value("data_chat").toString();
ui->recive_textEdit->append(insert_data);
ui->recive_textEdit->append("<font color=\"#00FFFF\">"+insert_chat_data+"</font> "); //设置字体颜色
ui->recive_textEdit->append(" ");
}
}
}
- 最后就是打包,测试了
当我兴高采烈的打包完成,去开心的测试时,出现了问题,打包之后的程序无法加载数据库,这就难办了,如果是发给电脑装有Qt、配置了环境变量、mysql数据库也装了,这几个条件都成立的情况下,程序是可以连接数据库的,但是如果其他电脑这些都没有,那么就需要添加驱动了,找了许多解决办法,发现还是不行,太难了。 - 等解决了这个最主要的问题之后再发方法上来吧!!!
六、需要完善的地方
- 谁都可以注册,需要注册时,添加一个注册码,就在数据库添加一个属性就行,注册码正确则给你注册。所以现在我把注册功能注释掉了。
- 好友在线功能,给用户表再添加一个属性,设置一个标志位,当点击登录时,把标志位变成1,之后就是在好友列表后,加载一个图标即可,当程序退出时,把标志位清0就能完成下线的功能。