✿写在开头

之前只总结了透明、无边框、可移动窗口的UI处理,为了给某位同学提供些学习资料,我再总结些功能要点。

原则:少说废话,多上代码。

✿登录窗口

登录操作TcpSocket,如果你非要问我为什么不是UDP Socket ,我只能说因为tcp可靠

❀登录

在确保设置IP端口后,通过QDataStream 写 QIODevice

void login::on_loginButton()
{usrname = ui->usrnamelineEdit->text().trimmed();password = ui->passwordlineEdit->text().trimmed();QRegExp rx("^[1-9]{1,2}[0-9]{4,7}{1}quot;);rx.setPatternSyntax(QRegExp::RegExp);if (!rx.exactMatch(usrname)){QMessageBox::warning(NULL, tr("提示"), tr("请输入QQ号."));}else{tcpSocket->abort();tcpSocket->connectToHost(QHostAddress(ip), (quint16)port.toUInt());QString msgType = "MSG_USER_LOGIN";QByteArray block;QDataStream out(&block, QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_4_6);out << (quint16)0 << msgType << usrname << password;out.device()->seek(0);out << (quint16)(block.size() - sizeof(quint16));tcpSocket->write(block);}}

登录反馈

void login::on_Read()
{QByteArray block = tcpSocket->readAll();QDataStream in(&block, QIODevice::ReadOnly);     //QDataStream in(tcpSocket);quint16 dataGramSize;QString msgType;in >> dataGramSize >> msgType;if ( "MSG_ID_NOTEXIST" == msgType ){QMessageBox::warning(NULL, tr("提示"), tr("该号码不存在,请先注册."));ui->usrnamelineEdit->clear();ui->passwordlineEdit->clear();}else if ( "MSG_PWD_ERROR" == msgType ){QMessageBox::information(NULL, tr("提示"), tr("密码错误."));ui->usrnamelineEdit->clear();}else if ( "MSG_LOGIN_ALREADY" == msgType ){QMessageBox::information(NULL, tr("提示"), tr("请不要重复登录."));ui->usrnamelineEdit->clear();ui->passwordlineEdit->clear();}else if ( "MSG_LOGIN_SUCCESS" == msgType){qqpanel = new panel(usrname, ip, port);qqpanel->setWindowTitle(tr("QQcopy"));qqpanel->setWindowFlags(Qt::FramelessWindowHint);qqpanel->setAttribute(Qt::WA_TranslucentBackground);qqpanel->show();this->close();}

❀服务器端的监听

首先Tcp server

void TcpSockServer::incomingConnection(int socketDescriptor)
{TcpConThread *thread = new TcpConThread(socketDescriptor, this);connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));thread->start();
}

窗口构造

Daemon::Daemon(QWidget *parent) :QMainWindow(parent),ui(new Ui::Daemon)
{ui->setupUi(this);this->setWindowTitle("QQ");ui->startListenButton->setText("开始监听");ui->ipLineEdit->setEnabled(true);ui->portLineEdit->setEnabled(true);ip.clear();port.clear();db = new SqliteDB;tableViewRefresh();}

数据信息的refresh

void Daemon::tableViewRefresh()
{db->connectDB();this->myModel = new MySqlQueryModel;this->myModel->setQuery(QObject::tr("select id, name, logstat from user order by logstat desc"));myModel->setHeaderData(0, Qt::Horizontal, tr("QQ号"));myModel->setHeaderData(1, Qt::Horizontal, tr("昵称"));myModel->setHeaderData(2, Qt::Horizontal, tr("状态"));ui->tableView->setModel(myModel);ui->tableView->setColumnWidth(0, 71);ui->tableView->setColumnWidth(1, 71);ui->tableView->setColumnWidth(2, 71);ui->tableView->show();db->closeDB();
}

系统广播和聊天UDP即可

void Daemon::on_send()
{QByteArray sysMsg;QDataStream tosend(&sysMsg,QIODevice::WriteOnly);tosend.setVersion(QDataStream::Qt_4_6);QString mytype="MSG_SERVER_INFO";tosend<<(quint16)0<<mytype<<ui->servTextEdit->toPlainText();tosend.device()->seek(0);tosend<<(quint16)(sysMsg.size()-sizeof(quint16));if(!udpSocket->writeDatagram(sysMsg.data(),sysMsg.size(),QHostAddress("192.168.1.255"),6666))QMessageBox::warning(NULL,"message broadcast","error");ui->servTextEdit->clear();
}
作者:yiyaaixuexi 发表于2011-7-28 1:45:27 原文链接
阅读:13191 评论:194 查看评论

转载于:https://www.cnblogs.com/jyshi/archive/2011/07/27/2139402.html

我的专属QQ 功能篇 (一)相关推荐

  1. 谷歌Chrome浏览器开发者工具教程—基础功能篇

    Chrome(F12开发者工具)是非常实用的开发辅助工具,对于前端开发者简直就是神器,但苦于开发者工具是英文界面,且没有中文,这让很多朋友都不知道怎么用.下载吧小编为大家带来Chrome开发者工具基础 ...

  2. 笔杆网试用---功能篇(一)

    引言 今天开始更新笔杆网试用体验的功能篇,鉴于笔杆网的大大小小的功能数目繁多,我会从论文写作的流程来一一介绍它的功能作用,功能具体操作,功能操作的不便之处,以及相比之下其他同类产品的功能对比结论. 笔 ...

  3. android app检测更新版本,《Android APP应该有的东西》之功能篇:版本检测更新

    <Android APP该有的东西>之功能篇:版本检测更新 自从友盟的自动更新下线之后,一大批app选择了自己写更新逻辑.是的,这里的逻辑并不复杂,完全可以自己写,但是不复杂不代表不麻烦, ...

  4. 【uni-app】uni-app实现聊天页面功能——功能篇(下)

    目录 前言 一.聊天框随键盘抬起 思路 代码实现 二.聊天消息列表随着聊天框的增高而滚动到最底部 思路 三.问题 完整代码实现 总结 前言 前面我有写关于如何进行聊天页面布局和实现聊天消息滚动到最底部 ...

  5. 国际网页短信系统平台搭建后台功能篇|移讯云短信系统

    国际网页短信系统平台搭建后台功能篇|移讯云短信系统 通道路由功能介绍 支持地区通道分流,支持关键字,关键词通道分流,支持白名单独立通道,支持全网通道分流,支持通道可发地区设置,通道路由分组,用户通道分 ...

  6. 国际网页短信软件平台后台功能篇|移讯云短信系统开发

    国际网页短信软件后台功能篇|移讯云短信系统开发 平台外放接口介绍 支持接入CMPP接口,支持smpp通道接入,支持外放CMPP接口(其他平台可以通过CMPP接入我平台),支持HTTP API JSON ...

  7. c#ATM之功能篇(存钱,取钱,转账,交易明细)完结篇

    c#ATM之功能篇(存钱,取钱,转账,交易明细)完结篇带详细注释 一个七个功能,不难,代码还有优化空间,之后再发一篇ATM之优化篇 首先先添加一条命名空间 using System.Data.SqlC ...

  8. 随机字符串解决大问题之腾讯网如何实现手机扫描二维码登录qq功能的

    随机字符串解决大问题之腾讯网如何实现手机扫描二维码登录qq功能的 腾讯网(www.qq.com)有一个扫码登录功能很有意思, 点击首页一键登录按钮,就会展现一个二维码,用手机qq扫描此二维码就可以使当 ...

  9. 数据分析利器之Excel功能篇

    数据说·实操季 先相信自己,然后别人才会相信你.   --罗曼·罗兰 导读:今天我们要介绍的关于Excel功能的系列内容,在数据分析行业里面的地位是举足轻重的.从使用范围来看,微软办公软件Office ...

最新文章

  1. 2020 Kaggle年度报告发布:美国公司最容易「人均百万」,90%数据科学家坚持终生学习...
  2. 【原】Java学习笔记030 - 异常
  3. java el jstl_java -EL技术JSTL技术
  4. node sqlite 插入数据_使用 Sequelize 操作 Sqlite3 数据库
  5. 安装docx模块出现Import Error: No module named 'exceptions'的解决方案
  6. yii2 java_YII2 自定义日志路径
  7. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)
  8. 51单片机有几个通用io口_51单片机IO口的四种使用方法
  9. 计算机组成原理 参考,计算机组成原理参考练习
  10. python 无法引入同级目录的方法_再见 virtualenv!K神教你轻松管理多个Python环境...
  11. iforums之UEditor上传图片提示【未知错误】
  12. 信息学奥赛一本通评测系统P1336
  13. 首日回顾:新一代区块链开发平台初步建成 | ArcBlock Devcon 2020
  14. 为什么说梯度的反方向是函数下降最快的方向
  15. Seabron作图:
  16. 安卓 jni 开发 —— Android Studio 打包 so 的坑
  17. 不能再忽视了!宝宝不肯吃粥的N个原因,你避免了几个?
  18. asp身份证号与姓名验证,asp身份证真伪查询,asp身份证核查代码
  19. linux命令查看删除哪些文件,linux删除文件除命令有哪些
  20. 反恐24小时[第1季]——我打赌这是我第一次写观后感

热门文章

  1. eclipse里source的快捷方法_教你如何在Linux中设置快捷方式图标
  2. 用java语言编写石头剪刀布获胜法_石头剪刀布Java实现
  3. python自动测试相机_Python + Appium+ IOS自动化测试
  4. 学好python需要哪些基础_学Python要避免哪些坑,如何巩固好基础
  5. linux shell 批量清空,shell脚本批量删除docker镜像
  6. Linux下docker的安装及常用命令
  7. Nginx——配置文件
  8. Redis——持久化RDB和AOF
  9. Pycharm 手把手安装(更新于2020-08-05)
  10. 用最简单直白的人类语言解释下jsonP到底是什么鬼