Telegram源码讨论(使用qt开发聊天软件)—— 聊天功能的实现

一尺丈量 2016-01-12 06:11:31
相信Telegram项目大家或多或少都会听讲过,就算不知道的也应该了解下。我们现在不是要讨论这个软件如何,而是想讨论下这个开源软件里使用到的技术。本人想研究下Telegram,但无奈在windows下还是linux都无法编译成功这个项目,看源代码也是无从下手。因此想发此贴,看看大家对Telegram中的一些功能的实现有什么想法。。。
废话就不说了,这里对下面的一个功能的实现提出疑问——那就是聊天框的实现:

通过查看它的源码,整个聊天框是一个自定义widget,那么聊天框外面就应该是一个scrollarea了(这里只是一种猜测,源码只看了一点点,不是一边调试一边看,而已还没有注释,很难看懂。),那么这里我猜测聊天框里的消息框也是通过重新实现paintEvent来实现的,那么消息框要怎么实现呢?当然,这样的外观是很容易实现的,但问题是消息框的功能——请看下面:

可以看到,消息框里面的文字是可以选择的(其实表情也可以选择),那么这种效果如果来实现呢?如果文字是利用drawText绘制出来的,那么在没有其他类的辅助下,文字是不可以选择的(其实原生drawText绘制出来的文字就像图片一样,那么图片当然不可以选择一部分)。
我的思考是会不会在QT本身就有这种绘制出来的文字也可以选择的原生api的实现,或者是Telegram的这个功能是通过其他方式自己实现的。那么到底是怎么实现文字与表情可以选择的呢?
注意到Telegram也不支持gif动画,这里还要提一个问题,在聊天面板是一个自定义的widget的情况下,如果添加对git动画的支持呢?

...全文
3392 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
森仔a 2018-07-05
  • 打赏
  • 举报
回复
引用 3 楼 u010155023 的回复:
[quote=引用 2 楼 dext 的回复:]
自己写一个类 继承自QGraphicsItem 就行了。

不知这方法行不行,但现在我用的是QWidget那一套,Telegram也是这样实现的吧?[/quote]
不是,它是继承QWidget实现的,可以看一下我的博客文章
https://blog.csdn.net/robinvanpersie/article/details/80923369
chenyu_limo 2018-05-06
  • 打赏
  • 举报
回复
请你下你是如何实现和telegram API通讯的。我一直卡主了, 报以下的错误信息,求帮忙看看,感激不尽! TransportRate:tryConnection #279929 TransportRate:onConnectionSuccess #279929 TransportRate:Transport: #279929 149.154.167.40:443 #1.0 java.io.IOException at org.telegram.mtproto.transport.PlainTcpConnection.readByte(PlainTcpConnection.java:87) at org.telegram.mtproto.transport.PlainTcpConnection.readMessage(PlainTcpConnection.java:45) at org.telegram.mtproto.transport.PlainTcpConnection.executeMethod(PlainTcpConnection.java:73) at org.telegram.mtproto.pq.Authorizer.executeMethod(Authorizer.java:51) at org.telegram.mtproto.pq.Authorizer.authAttempt(Authorizer.java:67) at org.telegram.mtproto.pq.Authorizer.doAuth(Authorizer.java:210) at org.telegram.api.engine.TelegramApi$ConnectionThread.waitForDc(TelegramApi.java:1041) at org.telegram.api.engine.TelegramApi$ConnectionThread.run(TelegramApi.java:1111)
Fireflies 2018-01-09
  • 打赏
  • 举报
回复
楼主解决了,源码看起来很费劲啊。。。
冷静忍耐 2016-01-28
  • 打赏
  • 举报
回复
引用 5 楼 u010155023 的回复:
[quote=引用 4 楼 u013466477 的回复:] QGraphicsTextItem可以,或者看2楼 添加对git动画的支持,QLabel就可以,QLabel其实也可以选中文字
QLabel是可以播放动画,但可以将一个label丢到QGraphicVIew里???[/quote] 可是可以,只是父对象是QGraphicVIew,移动位置就好,只是要实时算位置显示,这可以用,但这不是个好方法 既然想要创新。你最好可以自己实现,看QLabel源码,看它怎么能支持动画
一尺丈量 2016-01-27
  • 打赏
  • 举报
回复
引用 4 楼 u013466477 的回复:
QGraphicsTextItem可以,或者看2楼 添加对git动画的支持,QLabel就可以,QLabel其实也可以选中文字
QLabel是可以播放动画,但可以将一个label丢到QGraphicVIew里???
冷静忍耐 2016-01-27
  • 打赏
  • 举报
回复
QGraphicsTextItem可以,或者看2楼 添加对git动画的支持,QLabel就可以,QLabel其实也可以选中文字
一尺丈量 2016-01-13
  • 打赏
  • 举报
回复
引用 2 楼 dext 的回复:
自己写一个类 继承自QGraphicsItem 就行了。
不知这方法行不行,但现在我用的是QWidget那一套,Telegram也是这样实现的吧?
dext 2016-01-12
  • 打赏
  • 举报
回复
自己写一个类 继承自QGraphicsItem 就行了。
一尺丈量 2016-01-12
  • 打赏
  • 举报
回复
厚着脸上在github上面问了下,请看下面回答:

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧