“仿QQ局域网聊天软件”项目-常用编程技巧总结
1 信号槽篇
qqLogin loginDialog;
QQ mainDialog;
loginDialog.show();
//连接登陆窗口和主窗口
QObject::connect(&loginDialog,SIGNAL(SignalShowMainDialog(QTcpSocket *,QStringList)),&mainDialog,SLOT(SlotAcceptLogin(QTcpSocket *,QStringList)));
QStringList strlistUser;
strlistUser.append(userInfoArr[0]); //自身昵称
strlistUser.append(userInfoArr[1]); //自身QQ账号
strlistUser.append(userInfoArr[2]); //头像文件路径
strlistUser.append(userInfoArr[3]); //个性签名
emit SignalShowMainDialog(m_TcpSocket,strlistUser);//发射显示主窗口的信号,并把socket和QQ账号发给主窗口
上述两段代码实现了在“登陆窗口”按下“登陆按钮”后,打开“主窗口”,并把与服务器连接的m_TcpSocket
和用户信息传递给“主窗口”,展示了信号槽机制在不同窗口间传递数据的过程。如果要传递多个不同类型的数据,可以自定义一个结构体,通过结构体指针传递。
2 界面跳转篇
讲解之前,我们先讲述一下非模式对话框和模式对话框的含义。
一. 非模式对话框
非模式对话框是和同一个程序中其它窗口操作无关的对话框。在字处理软件中查找和替换对话框通常是非模式的来允许同时与应用程序主窗口和对话框进行交互。调用show()
来显示非模式对话框。show()
立即返回,这样调用代码中的控制流将会继续。在实践中你将会经常调用show()并且在调用show()的函数最后,控制返回主事件循环。
二. 模式对话框
模式对话框就是阻塞同一应用程序中其它可视窗口的输入的对话框:用户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框有它们自己的本地事件循环。用来让用户选择一个文件或者用来设置应用程序参数的对话框通常是模式的。调用exec()
来显示模式对话框。当用户关闭这个对话框,exec()
将提供一个可用的返回值并且这时流程控制继续从调用exec()
的地方进行。通常,我们连接默认按钮,例如“OK”到accept()槽并且把“Cancel”连接到reject()槽,来使对话框关闭并且返回适当的值。另外我们也可以连接done()槽,传递给它Accepted或Rejected。
下面正式看代码:
//注册账号
void qqLogin::on_registerPushButton_clicked()
{Cregister registerDialog;//注册窗口的实例化对象registerDialog.setTcpSocker(m_TcpSocket);QObject::connect(&loginDialog,SIGNAL(SignalShowMainDialog(QTcpSocket *,QStringList)),&mainDialog,SLOT(SlotAcceptLogin(QTcpSocket *,QStringList))); this->hide();//当前登陆窗口隐藏if(registerDialog.exec() == Cregister::Accepted)this->show();//再显示登陆窗口
}
//“注册窗口”的取消按钮处理
void Cregister::on_cancelPushButton_clicked()
{this->accept();//执行该语句,该Cregister实例窗口会关闭
}
registerDialog.exec()
的意思是:执行模式对话框,显示"注册窗口",并在这里阻塞住,知道该窗口被关闭之后,才继续往下运行。正因为在这里阻塞住了,所以才没有执行this->show()
,再显示登陆窗口。
调用this->accept();
的作用是:将当前的窗口隐藏(这样就做到窗口功能消失这个功能),并且发送accepted
信号,也就是设置设置结果代码为Accepted。
后面就好理解了,当“注册窗口”的取消按钮按下后,调用this->accept();
,发出accepted
的信号,“注册窗口”关闭,if(registerDialog.exec() == Cregister::Accepted)
这句话成立,所以继续执行到this->showshow()
这句话,然后显示“登陆窗口”。
3 正则表达式篇
//设置正则表达式
QValidator *accountValidator = new QRegExpValidator(QRegExp("[0-9]{10}")); //设置"账号输入栏",只能输入数字0-9,不超过10位
ui->userNameLineEdit->setValidator(accountValidator);
QValidator *passwordValidator = new QRegExpValidator(QRegExp("[0-9]{10}"));
ui->passwdLineEdit->setValidator(passwordValidator);
上面代码通过正则表达式,可以设置文本输入栏的输入限制,比如设置输入必须要是数字,以及设置输入位数。
4 MySQL数据库命令篇
在Qt中连接MySQL数据库:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("mydata");
db.setUserName("root");
db.setPassword("root");
if (!db.open())
{QMessageBox::critical(nullptr, QObject::tr("无法打开数据库"),"无法创建数据库连接!", QMessageBox::Cancel);return false;
}
创建数据库表:
QSqlQuery query;
//创建用户信息表(userTable): 昵称、QQ账号、在线状态(bit)
query.exec("create table userTable(id varchar(20) primary key, nickname varchar(40), account varchar(20), pwd varchar(20), onlineStatus bit)character set = utf8");
插入数据到表中:
QSqlQuery query;
//插入初始"用户信息"到表"userTable"中
query.exec("insert into userTable values('1', '凛冬将至', '359194773', '6981', 0)");
查找表比较账号和密码,看数据库是否有该用户:
bool findUserFlag = false;//从表"userTable"中查找用户信息
QSqlQuery query;
query.exec("select nickname,account,pwd from userTable");
while(query.next())
{if(query.value(1).toString() == userAccount && query.value(2).toString() == userPasswd){//数据库表:昵称、账号、密码m_userInfoArr[0] = query.value(0).toString();m_userInfoArr[1] = query.value(1).toString();m_userInfoArr[2] = query.value(2).toString();findUserFlag = true;break;}
}
设置表的单个数据:
//将该用户的在线状态设置为1
if(findUserFlag)
{query.prepare(QString("update userTable set onlineStatus = ? where account = %1 ").arg(userAccount));query.bindValue(0,1); //0表示第一个属性onlineStatus,将其值设置为1query.exec();
}
设置表的多个数据:
//将从客户端"注册窗口"接收到的"用户信息",插入到表"userTable"中
if (query.prepare("INSERT INTO userTable(id,nickname,account,pwd,onlineStatus)" \
"VALUES(:id,:nickname,:account,:pwd,:onlineStatus)"))
qDebug() <<"数据库准备成功";
query.bindValue(":id",iDataSize);
query.bindValue(":nickname",strNickname);
query.bindValue(":account",strQQAccount);
query.bindValue(":pwd",strPwd);
query.bindValue(":onlineStatus",0);
query.exec(); //执行完query.exec(),才能真正插入数据
转载于:https://www.cnblogs.com/linuxAndMcu/p/10191959.html
“仿QQ局域网聊天软件”项目-常用编程技巧总结相关推荐
- QQ局域网聊天软件MFC CSocket编程
使用的工具是VS2010 C++ 使用MFC类CSocket类进行通信 实现在局域网内1对1通信.客户端登陆时无需手动输入服务器的IP地址,端口号. 服务器监听 客户端发送局域网广播信息 服务器收到 ...
- 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框
上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...
- 仿qq左滑删除listview_Java基于Swing和Netty仿QQ界面聊天小项目
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 来源:b ...
- Java基于Swing和Netty仿QQ界面聊天小项目
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/weixin_44048 ...
- qq聊天界面 java_JAVA基于Swing和netty仿QQ界面聊天小项目
这是登录成功的界面 package chat.Frame.chat; import chat.Frame.operation.alterColumn.changeNickname; import ch ...
- qt通过Tcp和SQL实现仿qq的聊天软件
此项目较难,不建议初学者下载 资源下载: 点击打开链接 项目流程图: 程序运行效果: 客户端: 1.引导界面,用于加载初始化图片资源等 2.登录界面,包含判断服务器是否开启,网络是否可用,数据库信息核 ...
- 基于Qt的QQ局域网聊天
近几日闲来无事,便想做个东西玩玩,敲敲代码,取取经,玩玩Qt,做点小Demo.参考多方资料,结合了众多网友的技术,做了一个基于Qt的QQ局域网聊天软件. 源码下载:https://joeyos.git ...
- qt 设置按钮大小_基于Qt的QQ局域网聊天
近几日闲来无事,便想做个东西玩玩,敲敲代码,取取经,玩玩Qt,做点小Demo.参考多方资料,结合了众多网友的技术,做了一个基于Qt的QQ局域网聊天软件. 源码下载:点击下载源码 GithubPage: ...
- java小项目之成绩管理、排课软件、局域网聊天软件
大三下,想把上个学期的一些东西整理一下.可能是突然有点想法吧. 我把答辩ppt以及文档要求还有项目文件夹全部都放在了我的github里面啦.点击打开链接 项目一 问题描述:教师在教学过程中,需要记录学 ...
- 局域网聊天软件都有哪些?几款常用的局域网聊天软件推荐
随着科技的不断发展,人们在日常生活和工作中越来越需要高效便捷的沟通工具.而局域网聊天软件就是一种在局域网内使用的聊天工具,它能够帮助用户在同一网络内的设备之间进行即时通讯,无需依赖于互联网连接,安全又 ...
最新文章
- 那些年,让我面试头大的几个排序算法,今天终于搞懂了!
- 第46条:不要使用 dispatch_get_current_queue
- java 移动页面中的图片上传_HTML5移动端图片上传(一)
- i红枣:在没有暴露链接地址的C#情况下
- Simulink之交流调压电路
- 父亲节——女儿的礼物
- 使用iSCSI搭建IP SAN存储网络
- Python基础--03
- 苹果手机各种尺寸详细表以及iPhoneX、iPhone 11、iPhone 12、iPhone 13 屏幕适配,状态栏高度问题
- 一纸学习康奈尔笔记法
- 记录:java实时回传大疆无人机的视频和音频,低延时,稳定高效,可以对接飞行数据、经纬度信息、飞行轨迹等
- jQuery获取、设置标签属性值
- 解决zeal文档下载不上的办法
- final 修饰的成员变量必须手动初始化
- 基于安卓手机使用Termux搭建web服务器教程
- 消防管件做的机器人图片_消防管道配件制成机器人
- python实现打卡
- 卡顿老笔记本换新颜--增加内存条(内存条如何选购终极总结)
- 树莓派远程音乐播放器
- html网页设计期末大作业——绿色化妆品网页设计(4页)
热门文章
- pdf虚拟打印机免费版使用教程
- python110道面试题
- java人脸识别怎么写-------源码附上
- PHP微信多级三级分佣系统,微信多级三级分销系统 多级三级分佣模式 支付宝微信双支付...
- 计算机网络应用平面设计广告设计,互联网时代平面广告设计
- HTML5日期输入框(date)
- COSMIC的后端学习之路——1.4 + 1.5 设计模式
- 计算机毕业设计springboot家政管理系统
- java随机抽取数字_java 获取随机数字的三种方法
- 用户画像方法论与工程化解决方案 pdf_《用户画像》作者:赵宏田