首页 > 其他分享 >基于PyQt5实现聊天窗口

基于PyQt5实现聊天窗口

时间:2023-07-28 10:00:16浏览次数:41  
标签:widget 窗口 text self PyQt5 width 聊天 plainTextEdit 气泡

本文仅为示例,用于参考,功能并不完整

主要实现以下功能:

1.重写PlainTextEdit组件实现类似微信ctrl+enter换行,enter发送信息操作

2.带头像的消息气泡创建

3.消息气泡的自适应大小


窗口布局(详细可以通过示例代码中的.ui进行查看)


代码获取地址

GitHub:PyQt5-Chat-Demo

百度网盘:https://pan.baidu.com/s/1Pi06nAeOo9sWiNaaHgC86w?pwd=ayhf

image


代码详解(请先获取代码方便对照)

1.窗口初始化与定义

主要操作:初始化,定义信号与槽

class MainWindow(QMainWindow,Ui_MainWindow):
    def __init__(self,parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.sum=0                                                  #气泡数量
        self.widgetlist = []                                        #记录气泡
        self.text = ""                                              # 存储信息
        self.icon = QtGui.QPixmap("1.jpg")                          # 头像
        #设置聊天窗口样式 隐藏滚动条
        self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        # 信号与槽
        self.pushButton.clicked.connect(self.create_widget)         #创建气泡
        self.pushButton.clicked.connect(self.set_widget)            #修改气泡长宽
        self.plainTextEdit.undoAvailable.connect(self.Event)        #监听输入框状态
        scrollbar = self.scrollArea.verticalScrollBar()
        scrollbar.rangeChanged.connect(self.adjustScrollToMaxValue) #监听窗口滚动条范围

2.回车发送的实现

用户回车->plainTextEdit声明于PlainTextEdit_Rewite.py的重写方法被激活->初始化函数的信号监听到->执行槽函数

主要操作:模拟发送点击事件(会导致TextEdit焦点消失),TextEdit重新设置焦点

    # 回车绑定发送
    def Event(self):	#注意,这个方法是先通过了PlainTextEdit_Rewite.py的重写方法激活了上方代码的信号,才执行的槽函数
        if not self.plainTextEdit.isEnabled():     #当PlainTextEdit处于禁用状态执行下面代码
            self.plainTextEdit.setEnabled(True)
            self.pushButton.click()
            self.plainTextEdit.setFocus()

Qt5没有原生的回车发送的方法,试过很多方法,对比来看,用信号监听plainTextEdit的状态是最稳定且方便的


3.生成气泡并插入scrollArea

调用new_widget.py下set_return方法创建新组件并插入scrollArea

    #创建气泡
    def create_widget(self):
        self.text=self.plainTextEdit.toPlainText()
        self.plainTextEdit.setPlainText("")
        self.sum += 1
        if self.sum % 2:   # 根据判断创建左右气泡
            Set_question.set_return(self, self.icon, self.text,QtCore.Qt.LeftToRight)    # 调用new_widget.py中方法生成左气泡
            QApplication.processEvents()                                # 等待并处理主循环事件队列
        else:
            Set_question.set_return(self, self.icon, self.text,QtCore.Qt.RightToLeft)   # 调用new_widget.py中方法生成右气泡
            QApplication.processEvents()                                # 等待并处理主循环事件队列

窗口组件的层级关系请看上方窗口布局


4.修改气泡组件长宽

Qt5组件的更新方式比较奇怪,只有在气泡组件创建完成后才能获取到文本框适应的宽高,所以这里是在创建好后再进行修改,可以看到修改方式比较傻瓜,但起码效果还是能看的

    # 修改气泡长宽
    def set_widget(self):
        font = QFont()
        font.setPointSize(16)
        fm = QFontMetrics(font)
        text_width = fm.width(self.text)+115    #根据字体大小生成适合的气泡宽度
        if self.sum != 0:
            if text_width>632:                  #宽度上限
                text_width=int(self.textBrowser.document().size().width())+100  #固定宽度
            self.widget.setMinimumSize(text_width,int(self.textBrowser.document().size().height())+ 40) #规定气泡大小
            self.widget.setMaximumSize(text_width,int(self.textBrowser.document().size().height())+ 40) #规定气泡大小
            self.scrollArea.verticalScrollBar().setValue(10)

5.窗口自动滚动

信号监听窗口滚动条范围,执行此槽函数

    # 窗口滚动到最底部
    def adjustScrollToMaxValue(self):
        scrollbar = self.scrollArea.verticalScrollBar()
        scrollbar.setValue(scrollbar.maximum())

布局文件的改动(注意)

因为本示例重写了QPlainTextEdit,所以如果你通过PyUIC重新生成了布局文件,需要在布局文件中将组件的声明也修改掉。

PyUIC生成的代码

self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)

修改为

from PlainTextEdit_Rewite import MyPlainTextEdit

self.plainTextEdit = MyPlainTextEdit(self.frame)

以本文作为示例可以制作一个chatgpt的桌面聊天软件

image

END

标签:widget,窗口,text,self,PyQt5,width,聊天,plainTextEdit,气泡
From: https://www.cnblogs.com/Rrea/p/17584484.html

相关文章

  • 《Win32篇》纯C和Win32实现窗口
    纯C和Win32实现窗口参考链接:https://www.cnblogs.com/zjutzz/p/10806955.htmlwindows下实现窗口显示,如果限定是C/C++语言,并且是原生Windows支持,需要使用GDI或GDI+。一般是在VisualStudio里新建Win32应用程序,而不是Win32consoleapplication(控制台程序),然后使用GDI的一些API,例如......
  • 2、了解Webots的窗口-2
    一、WebotsGUI由四部分组成:1、3D窗口:显示并允许与3D模拟交互的窗口;2、Scenetree:它是当前世界的层次表示;3、Texteditor:允许编辑源码;4、Console:显示编译和控制输出;二、分别介绍一下八个菜单栏1、File:允许执行通常的文件操作,如加载,保存等等2、View:允许控制仿真窗口中的可视......
  • 基于Hologres向量计算与大模型免费定制专属聊天机器人
    简介:本文为您介绍如何基于Hologres向量计算能力,结合大模型的阅读理解和信息整合能力,对该垂直行业的问题提供更贴切的回答,即费、快速定制专属聊天机器人。背景信息大模型可以广泛应用于各行各业。使用大模型定制聊天机器人,除了训练大模型的方式外,还可以使用提示词微调(Prompt-tuning)......
  • python如何打开命令行窗口
    在Python中,我们可以使用os模块来打开命令行窗口。os模块提供了与操作系统相关的功能,包括运行命令行命令和打开命令行窗口。首先,我们需要导入os模块:importos然后,我们可以使用os.system()函数来运行命令行命令。为了打开命令行窗口,我们可以使用操作系统提供的命令来启动命令行终......
  • 1.1 HELLO 窗口
    跟着教程,开始第一步创建窗口吧!这一节不涉及太多知识。本节会出现一些名词,我们现在只需要知道它们大概是干什么的就行。●GLFW:一个专门针对OpenGL的C语言库,通过它提供的接口,我们就可以渲染物体了;●GLAD:用来管理OpenGL函数指针的库,在调用所有OpenGL函数之前,我们要初始GLAD;●......
  • 如何实现安卓屏幕分享及视频聊天?(源码)
    在一些有人际互动的手机APP中,增加语音视频聊天功能是一个常见的需求。而现在,更进一步,在某些场景下,我们需要能将自己的手机屏幕分享给他人,或者是观看他人的手机屏幕。那么,这些常见的功能是如何实现的了?我为此专门写了一个安卓版的Demo,并将源码放出来供大家参考,希望对大家有所帮助......
  • 还原窗口 取消最小化
    #include<Windows.h>intmain(){//获取目标窗口的句柄HWNDhWnd=FindWindow(nullptr,L"1111111");if(hWnd!=nullptr){//将窗口还原(取消最小化)ShowWindow(hWnd,SW_RESTORE);//激活窗口并将其带到前台SetForegr......
  • android开发 - Widgets窗口小部件
    Widgets指的窗口小部件 自定义一个Widgets做时间的窗口小部件一个widget是一个广播接受者,需要在清单中注册第一,有一个widgetpublicclassMainWidgetextendsAppWidgetProvider{@OverridepublicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,i......
  • Android基于XMPP Smack openfire 开发的聊天室
    Android基于XMPPSmackopenfire开发的聊天室简介聊天室是人们进行实时沟通和交流的常见方式。而在移动应用开发中,实现一个聊天室功能是非常常见的需求。本文将介绍如何基于Android平台使用XMPPSmack库和Openfire服务器开发一个简单的聊天室应用。准备工作在开始开发之前,确保......
  • vim 多窗口编辑
    方式1:tab类切换命令vim从vim7开始加入了多标签切换的功能,相当于多窗口.之前的版本虽然也有多文件编辑功能,但是总之不如这个方便啦。用法:tabnew[++opt选项][+cmd]文件建立对指定文件新的tab:tabc关闭当前的tab:tabo关闭所有其他的tab:tabs查看所有打开的tab:tabp前一......