0
点赞
收藏
分享

微信扫一扫

PyQt模拟微信页面开发(一)

一、引述

网上关于Qt模拟微信、QQ的页面开发的多如牛毛,但C++本身来说逻辑上难上手,对只会Python的小伙伴来说太痛苦了。
今天就为大家开个场(下节更精彩),众所周知,要想模拟微信、QQ等这种聊天工具,最重要之一就是聊天框里的气泡问题。

二、气泡图

在这里插入图片描述

三、思路

我们应该知道在聊天框里,每一天聊天记录都是一个item,这个item里包含了头像和信息这两部分内容。
解决这个难题的方法之一就是使用QPainter来进行画图,然后封装成一个QWidget作为一个item。
而聊天框架则使用QListWidget,每当点击发送按钮,触发添加一个item事件。
思路是这样,但实现起来比较难,为此我从CSDN里找到了一位大佬的推文,虽说是C++的Qt写的,但重写为python,问题不大。
首先,我们先写一个气泡类,重写paintEvent事件,并且在类中自定义了消息文本变量data。

window_height = 10
begin_width_spacing = 20
begin_height_spacing = 16
icon_width = 40
icon_height = 40
text_width_spacing = 12
text_height_spacing = 12
triangle_width = 6
triangle_height = 10
triangle_height_spacing = 10
text_min_width = 0
min_width = 0
text_max_width = 0
real_width = 0
text_height = 0
class MyWidget(QtWidgets.QWidget):
    def __init__(self, parent=None, data='',type_mess = 0):
super(MyWidget, self).__init__(parent)
self.setObjectName('myWidget')
self.user_chat_content = data

# 重写paintEvent 否则不能使用样式表定义外观
def paintEvent(self, event):
self.init_data() # 获取文本长度、气泡框架问题

一个气泡的大小决定于文本的长度(自动换行),因此呢,我们应该先定义font的类型,它的字体和大小。

def init_data(self):
    font = QtGui.QFont()
    font.setFamily("实体")
    font.setPointSize(12)
    metrics = QFontMetrics(font)
    global text_min_width, min_width,text_max_width,real_width, text_height, window_height
    if metrics.width("A") * 2 + begin_height_spacing * 1.5 > text_width_spacing:
    text_min_width = begin_height_spacing * 1.5 - text_width_spacing
    else:
    text_min_width = 0
    min_width = begin_width_spacing + icon_width + triangle_width + text_width_spacing + text_width_spacing + icon_width + begin_width_spacing
    if self.width()< min_width+text_min_width:
    self.setMinimumWidth(min_width + text_min_width)
    text_max_width = self.width() - min_width
    real_width = metrics.width(self.user_chat_content)
    if real_width < text_max_width:
    text_max_width = real_width
    if text_height_spacing+metrics.height()+text_height_spacing>triangle_height_spacing+triangle_height+triangle_height_spacing:
    text_height = metrics.height()
    else:
    text_height = triangle_height_spacing + triangle_height + triangle_height_spacing
    else:
    flag = QtCore.Qt.TextWordWrap
    textRect = QRect(0, 0, text_max_width, 0)
                # 自动换行
    textRect = metrics.boundingRect(textRect, flag, self.user_chat_content)
    text_height = textRect.height()

初始化完一些气泡的宽度、长度后,接下来就是画气泡的问题了。气泡=头像+信息,但气泡又分为两种,一种是自己发送的消息气泡,而另一种是对方发送的气泡,分别占据右侧和左侧。

因此呢,还需要再添加一个变量才行,用来判定是否是接收方。最后就是调用painter.drawPixmap函数画出头像,painter.drawText来画出文字即可。

今天就为大家开个场,更多精彩点击这里。

举报

相关推荐

0 条评论