Qt+html+JavaScript实现类似QQ聊天界面的气泡效果

这是一个简单的类似QQ聊天界面的Demo,用Qt实现,在QWebView里嵌入网页的方式实现。先看效果图:
这里写图片描述
无论怎样,我觉得自己动手写出来的东西才是自己的,所以源码不全,重点的代码我会放上来。只是模拟实现了两个人的聊天,并没有真正实现聊天。
首先这里定义两个人的头像,可以看到,otherhead的图片是在桌面上,因此,文件并不一定非要加载在资源文件里面,使用相对路径来定义。
以下均在构造函数中定义和加载:

/**定义两个人的头像*/Myhead = "<img src=qrc:/chatdemo/Msg/Head.png width='30px'heigth='30px'>";QString strHead = QString("C:/Users/tax10_000/Desktop/ql_184555_828078.jpg");otherhead = QString ("<img src=%1 width='30px' heigth='30px'>").arg(strHead);

接下来,重点来了,因为是用html+JavaScript实现的气泡效果,所以,一定要在QWebView中加载html文件。

QFile source( ":/chatdemo/Msg/msg.html" );int fd = source.open( QIODevice::ReadOnly );m_ui.webView->setHtml( QString::fromUtf8( source.readAll().constData() ) );source.close();/**定时器产生*/m_timer = new QTimer();connect( m_timer , SIGNAL( timeout() ) , this, SLOT( disTime() ) );m_timer->start( 6000 );

下面这个函数是实现图片的发送和接收:

void chatdemo::slot_btnpicClicked()
{QString FilePath = QFileDialog::getOpenFileName();QFile file( FilePath );bool ok = file.open( QIODevice::ReadOnly );if( !ok ) { return; }QString msg = QString("<img src=%1 />").arg( FilePath );QString MyHead = QString("<img src=%1 width='30px' heigth='30px'/>").arg(FilePath);QString Msg = QString ("<img src=qrc:/chatdemo/Msg/downloading.jpg/>");SendMsgShow(msg,MyHead);RevMsgShow( Msg,otherhead);}

下面这个函数的功能是当LineEdit中有内容时,将LineEdit中的内容显示在界面上并清除LineEdit中的内容,如果发送是“你好”或者“时间”时,假设对方会回答你。

void chatdemo::slot_lineEditReturnpressed()
{if( m_ui.lineEdit->text() == NULL ){QMessageBox::warning( this , "warning","Can't send an empty msg!" );return;}/**自己发送的消息*/SendMsgShow( m_ui.lineEdit->text() , Myhead );if( m_ui.lineEdit->text() == QString::fromLocal8Bit("你好") ){RevMsgShow( QString::fromLocal8Bit( "请问有什么可以帮助你吗?" ), otherhead );}else if(m_ui.lineEdit->text() == QString::fromLocal8Bit( "时间" ) ){RevMsgShow( QString::fromLocal8Bit( "北京时间:%1" ).arg( QTime::currentTime().toString( "hh:mm:ss" ) ), otherhead );}m_ui.lineEdit->clear();
}

下面这个函数的功能是将自己发送的消息显示界面上:

void chatdemo::SendMsgShow(QString msg ,QString head)
{QString html = QString( "" );html.append(QString("document.getElementById(\"content\").insertAdjacentHTML(\"beforeEnd\",\"<div style='overflow:hidden;'><p class='divMyHead'>%1 </p><p class='triangle-right right'>%2</p></div>\")" ).arg( head ).arg( msg ) );m_ui.webView->page()->mainFrame()->evaluateJavaScript(html);    m_timer->start( 30000 );
}

下面这个函数的功能是将对方发来的消息显示在界面上:

void chatdemo::RevMsgShow(QString msg,QString head)
{QString html = QString("document.getElementById(\"content\").insertAdjacentHTML(\"beforeEnd\",\"<div style='overflow:hidden;'><p class='divotherhead'>%1 </p><p class='triangle-left left'>%2</p></div>\")").arg(head).arg(msg);m_ui.webView->page()->mainFrame()->evaluateJavaScript(html);

下面函数的定义是结束定时器

void chatdemo::disTime()
{m_timer->stop();
}

当然,最重要的还是html文件,因为在这个demo里面,html文件起着最重要的作用:

<html><head><style>img{max-width:100px;max-height:100px;margin: 0 0;}  /*定义显示的格式*/p{color:  black;font-family: "Arial", "san-serif";font-size: 14px;display: inline;}/*自己的消息*/.myMsg{max-height: 300px;max-width:  300px;position: relative;float: right;}/*显示自己的头像*/.divMyHead{position: relative;float: right;margin:5px 0px 5px 0px;right: 1px;border-radius: 5px;}/*对方的消息*/.otherMsg{max-height: 300px;max-width:  300px;position: relative;float: right;}/*显示对方的头像*/.divotherHead{position: relative;float: left;margin:5px 0px 0px 0px;left: 1px;border-radius: 5px;}/*实现对方发送来的消息的方框*/.triangle-left{float:left;max-width:380px;border:1px solid #ffffff;border-radius:5px;padding:4px;background:#ffffff;position:relative;display:inline-block;margin:5px 0px 5px 20px;word-wrap: break-word;}.triangle-left:before{position:absolute;content:"";display:block;}/*实现对方消息的那个小三角,小三角的实现其实是将一个正方形对角线划分为四个小三角,其余的三个设置颜色不可见,只将对自己有用的那一个留下来*/.triangle-left.left:before{border-color:rgba(0, 0, 0, 0) #ffffff rgba(0, 0, 0, 0) rgba(0, 0, 0, 0);border-width:5px 5px 5px 0;border-style:solid;bottom:auto;left:-5px;top:8px;}.triangle-left.left:after{border-color:rgba(0, 0, 0, 0) #ffffff rgba(0, 0, 0, 0) rgba(0, 0, 0, 0);border-width:5px 5px 5px 0;border-style:solid;bottom:auto;left:-5px;top:8px;}/*实现右边的气泡*/.triangle-right{float:right;max-width:380px;border:1px solid #bedfff;border-radius:5px;padding:5px;                        background:#bedfff;position:relative;display:inline-block;margin:5px 20px 5px 0;word-wrap: break-word;}.triangle-right:before{position:absolute;content:"";display:block;}.triangle-right.right:before{border-color:rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) #bedfff;border-width:5px 0px 5px 5px;border-style:solid;bottom:auto;right:-6px;top:8px;}.triangle-right:after{position:absolute;content:"";display:block;}.triangle-right.right:after{border-color:rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) #bedfff;border-width:5px 0px 5px 5px;border-style:solid;bottom:auto;right:-6px;top:8px;}</style><script language="JavaScript" >function img(){}function addFile(){var str = '<INPUT type="file" size="20" NAME="File">'document.getElementById("MyFile").insertAdjacentHTML("beforeEnd", str)alert("hello word!")}function getAll(){content = document.body.innerHTML           }/*将发送或接收的图片显示在气泡里面*/function append(){var obj = document.getElementById("content");obj.insertAdjacentHTML("beforeEnd","<div style='overflow:hidden;'><p class='divMyHead' width='30px' height='30px'></p><p class='triangle-right right'>nice</p></div>");}function choosephoto(){         var obj = document.getElementById("content");obj.insertAdjacentHTML("afterEnd","<div style='overflow:hidden;'><p class='divMyHead' width='30px' height='30px'></p><p class='triangle-right right'>nice</p></div>");}function clear(){document.body.innerHTML=''
}</script></head><body id="content" style='background:#efefef'></body>
</html>

无论怎样,我觉得只有自己动手做了,其中的味道才能自己体会的到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15461.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt的聊天软件设计实现手把手教学——高仿QQUI设计(一)

文章目录 前言一、使用工具1. Qt Creator 二、项目介绍1.客户端1.1 Socket套接字 2.服务端2.1 数据库2.2 数据处理 3.效果图4.总体系统架构图 小结 前言 最近想把自己毕业设计拿出来分享&#xff0c;我是做了一个可以通过局域网聊天的一个聊天软件。UI设计方面我也是尽力往QQ方…

基于QML模拟QQ群聊窗口

据说最近要开发简单的IM工具,于是兴起,研究了下QQ聊天窗口,大概模拟了一下群聊的聊天显示界面,遂与大家分享之 画面粗糙还望海涵 图片有点大,原理基本就是使用listview来显示每一条记录,别人的记录显示在左侧,自己的聊天记录显示在右侧,但是他们公用的一个内容控件 贴下…

❤️Java实现模拟QQ(消息通信+登陆界面美化)❤️

一、登陆界面的实现 登陆界面主要使用了JFrame&#xff0c;以及相关的一些组件&#xff0c;并且在界面中加上监听 登陆界面效果图 登陆界面代码Login类 package com.lding.login;import com.lding.ui.MsgUI;import javax.swing.*; import java.awt.*; import java.io.IOExce…

QT qq登陆界面设计

使用C结合Qt设计的类似QQ的登录界面&#xff0c;以Ui以及代码结合的方式实现&#xff0c;实现了账号注册、号密对比等功能。先看看效果图&#xff1a; 登录界面&#xff1a; 注册界面&#xff1a; 一共有两个窗口&#xff0c;通过槽函数绑定按钮来显示弹窗&#xff08;注册界面…

QT学习之QQ聊天案例

1、实现功能 本程序模拟实现QQ群聊功能&#xff0c;采用UDP通信方式&#xff0c;可以设置字体&#xff0c;保存聊天记录等&#xff0c;实时显示上线离开人数以及具体人员。可视为简化版的腾讯QQ。目前只有群聊&#xff0c;未实现一对一单独聊天。 完整源代码见&#xff1a;ht…

【教学类-36-01】Midjounery生成的四张图片切片成四张小图

作品展示&#xff1a; 把一张正方形图片的四个等大小图切割成四张图片 背景需求 最近在学习ChatGPT的绘画&#xff08;midjounery AI艺术&#xff09; 我想给中班孩子找卡通动物图片&#xff08;黑白线条&#xff09;&#xff0c;打印下来&#xff0c;孩子们练习描边、涂色…

chatgpt赋能python:Python校验身份证号码真伪

Python校验身份证号码真伪 身份证号码是我们日常生活中非常重要的证件&#xff0c;但也有一些人从事非法活动&#xff0c;对身份证号码进行伪造或者篡改。为了保护公民的合法权益&#xff0c;我们需要使用技术手段来校验身份证号码真伪。而Python作为一种广泛应用于数据处理和…

【科普级别:刚出炉的ChatGPT三连问】

科普级别&#xff1a;刚出炉的ChatGPT三连问 前言【ChatGPT是什么&#xff1f;对我们的生活有什么影响&#xff1f;】【中国为什么不能使用ChatGPT&#xff1f;美国想让中国用户使用吗&#xff1f;】【通义千问、文心一言、ChatGPT你更看好哪一个&#xff1f;】 前言 有些人连C…

又一个国内类ChatGPT模型?【秘塔科技上线自研LLM大模型「对话写作猫」】

又一个国内类ChatGPT模型&#xff1f;【秘塔科技上线自研LLM大模型「对话写作猫」】 &#xff08;马上被打脸 ~ ~&#xff09; 一直期待中国有没有类ChatGPT产品可以出现。 昨天&#xff0c;2023年2月27日&#xff0c;秘塔科技上线了自研LLM大模型「对话写作猫」&#xff0c;…

小白入门区块链(通俗易懂)

区块链基础入门 什么是区块链 科技层面解释 数学&#xff0c;密码学&#xff0c;互联网&#xff0c;计算机编程官方解释 区块链是一个分布式的共享账本和数据库&#xff0c;具有去中心化&#xff0c;不可篡改&#xff0c;全程留痕&#xff0c;可以追溯&#xff0c;集体维护&am…

2023年加密行业会更难吗?欧科云链研究院“七大趋势预测”

回望2022&#xff0c;加密行业遭遇了种种不可控因素而导致的艰难险阻&#xff0c;也在变革与发展中孕育着生机与活力。 这一年&#xff0c;我们亲眼目睹了Luna暴雷&#xff0c;三箭资本、FTX这些曾经被认为“大而不倒”的机构接连倒下&#xff0c;市场信心严重受挫&#xff1b…

​别急着骂百度,来看看大模型到底怎么用

文&#xff5c;光锥智能&#xff0c;作者&#xff5c;周文斌&#xff0c;编辑&#xff5c;王一粟 GPT-4惊艳亮相后&#xff0c;压力来到百度这边。 上台后的李彦宏和百度CTO王海峰都略显紧张&#xff0c;这在多年百度相关活动中还是非常少见。李彦宏坦言&#xff0c;“文心一言…

Node.js 高级编程之 Stream(我是跟 ChatGPT 学会的)

前言 在做 SSR Stream Render 的时候遇到了 Node.js 的 Stream&#xff0c;但是对其总是一知半解。正好最近 ChatGPT 很火&#xff0c;找他学一学吧&#xff0c;没想到真的把我教会了。PS&#xff1a;文末有跟 ChatGPT 的精彩对话&#xff08;请忽略我稀烂的英语&#xff09;。…

《不想放水》

原创&#xff1a;刘教链 * * * 由刘教链和ChatGPT共同填词。原曲&#xff1a;S.H.E.《不想长大》。 为什么就是找不到放水的证据呀 为什么救助的银行都不愿退市啊 我并不希望他拥有比特币和黄金 我惊讶的是假话竟然会变成谎话 为什么美元印钞机要转的那么快 为什么通胀和失业率…

存储器介绍

文章目录 存储系统基本概念存储器的层次存储器的分类存储器的性能指标 主存储器半导体元件的原理存储芯片的基本原理寻址 DRAM和SRAMDRAM的刷新DRAM的地址复用 只读存储器ROM主存储器和CPU的连接位扩展字扩展字位同时扩展补充 双端口RAM和多模块存储器双端口RAM解决多核CPU访存…

OpenAI文档翻译——在不通的场景下如何更好的设计ChatGPT提示词

概述 OpenAI可以被广泛的应用于各种任务&#xff0c;他为各种模型提供使用简单而功能强大的API。你可以输入一些文本作为提示词&#xff0c;OpenAI则会生成对应的提示词补全&#xff0c;在使用过程中这就是会话形式以及能够记住上下文的体现。探索如何生成提示词的最好方法就是…

如何使用ChatGPT 写官方声明?

上海车展宝马Mini展台被指区别对待中外访客&#xff0c;向外国访客送冰淇淋&#xff0c;中国访客索要时则说“没有”&#xff0c;此事引发争议。 对此&#xff0c;宝马官方也发布了官方致歉声明&#xff0c;网友看到声明后&#xff0c;纷纷发布自己的看法&#xff0c;有网友还…

独家专访:OpenAI 的 Sam Altman 谈 ChatGPT 以及通用人工智能如何“打破资本主义”

来源: AI前线 作为 OpenAI 的首席执行官&#xff0c;Sam Altman 领导的这家初创公司是正在快速增长的生成式 AI 行业中最热门且最受关注的一家。在 1 月中旬参观了 OpenAI 的旧金山办事处后&#xff0c;福布斯采访了这位最近不太愿意在媒体上抛头露面的投资者和企业家&#x…

ChatGPT is not all you need,一文看尽SOTA生成式AI模型:6大公司9大类别21个模型全回顾(三)

文章目录 ChatGPT is not all you need&#xff0c;一文看尽SOTA生成式AI模型&#xff1a;6大公司9大类别21个模型全回顾&#xff08;三&#xff09;Text-to-Text 模型ChatGPTLaMDAPEERMeta AI Speech from Brain Text-to-Code 模型CodexAlphacode Text-to-Science 模型Galacti…

千万级入口服务[Gateway]框架设计(三:分层模式)

本文将以技术调研模式编写&#xff0c;非技术同学可跳过。 文章目录 背景分层分发Handle分发hook分发并发分层 管道ChannelDemo 实现 小结 附录 背景 基于组件(插件)模式设计构建的入口服务实现中&#xff0c;使用 Go 原生包 plugin 的时候&#xff0c;会存在功能缺陷问题&am…