首页 > 其他分享 >PyQt5 使用 QFrame 绘制聊天(三角)气泡,并显示文字

PyQt5 使用 QFrame 绘制聊天(三角)气泡,并显示文字

时间:2024-09-14 15:02:52浏览次数:9  
标签:10 center self PyQt5 QPoint QFrame rect 气泡

PyQt5 使用 QFrame 绘制聊天(三角)气泡,并显示文字

PyQt5 中,当需要想得到一个自定义的聊天气泡时,可以使用 QPainter 进行自定义绘制

代码如下

使用 QPainter 进行自定义绘制

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_QFrame.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : QFrame 聊天(三角)气泡
"""
from PyQt5.QtWidgets import QApplication, QFrame, QWidget, QVBoxLayout, QLabel
from PyQt5.QtGui import QPainter, QBrush, QPen, QColor
from PyQt5.QtCore import QPoint


class QFrameBubble(QFrame):
    def __init__(self, text, parent=None, pen="#000000", brush="#E0F7FA", triangle_position="left"):
        super().__init__(parent)
        self.pen = pen  # 画笔颜色
        self.brush = brush  # 笔刷颜色
        self.triangle_position = triangle_position  # 三角形位置

        # 设置无边框,以便自定义绘制
        self.setFrameStyle(QFrame.NoFrame)

        # 创建 QLabel 显示文字
        self.label = QLabel(text, self)
        self.label.setStyleSheet("background: transparent;")  # 设置背景透明
        self.label.setWordWrap(True)  # 如果文字过长,自动换行

        # 设置布局,将 QLabel 添加到 ChatBubble 中
        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.setContentsMargins(20, 10, 20, 20)  # 设置气泡内部边距
        self.setLayout(layout)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing, True)

        # 设置画笔和笔刷
        pen = QPen(QColor(self.pen))
        painter.setPen(pen)
        brush = QBrush(QColor(self.brush))
        painter.setBrush(brush)

        # 绘制气泡的矩形部分
        rect = self.rect()
        rect.adjust(10, 10, -10, -10)  # 调整矩形的大小
        painter.drawRoundedRect(rect, 10, 10)

        if self.triangle_position == 'left':
            # 绘制气泡的三角部分在左侧中央
            points = [
                QPoint(rect.left(), rect.center().y() + 10),
                QPoint(rect.left() - 10, rect.center().y()),
                QPoint(rect.left(), rect.center().y() - 10)
            ]
        elif self.triangle_position == 'right':
            # 绘制气泡的三角部分在右侧中央
            points = [
                QPoint(rect.right(), rect.center().y() - 10),
                QPoint(rect.right() + 10, rect.center().y()),
                QPoint(rect.right(), rect.center().y() + 10)
            ]
        elif self.triangle_position == 'bottom':
            # 绘制气泡的三角部分在底部中央
            points = [
                QPoint(rect.center().x() - 10, rect.bottom()),
                QPoint(rect.center().x(), rect.bottom() + 10),
                QPoint(rect.center().x() + 10, rect.bottom())
            ]
        else:
            # 绘制气泡的三角部分在顶部中央
            points = [
                QPoint(rect.center().x() + 10, rect.top()),
                QPoint(rect.center().x(), rect.top() - 10),
                QPoint(rect.center().x() - 10, rect.top())
            ]
        painter.drawPolygon(*points)

测试一下

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_QFrame.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description :
"""
from PyQt5.QtWidgets import QApplication, QFrame, QWidget, QVBoxLayout, QLabel
from PyQt5.QtGui import QPainter, QBrush, QPen, QColor
from PyQt5.QtCore import QPoint

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(400, 300)
        # 创建自定义气泡
        bubble1 = QFrameBubble("绘制气泡的三角部分在左侧中央", parent=self, triangle_position='left')
        bubble2 = QFrameBubble("绘制气泡的三角部分在右侧中央", parent=self, triangle_position='right')
        bubble3 = QFrameBubble("绘制气泡的三角部分在底部中央", parent=self, triangle_position='bottom')
        bubble4 = QFrameBubble("绘制气泡的三角部分在顶部中央", parent=self, triangle_position='top')

        # 设置布局
        layout = QVBoxLayout()
        layout.addWidget(bubble1)
        layout.addWidget(bubble2)
        layout.addWidget(bubble3)
        layout.addWidget(bubble4)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication([])
    window = Example()
    window.show()
    app.exec_()

image

本文章的原文地址
GitHub主页

标签:10,center,self,PyQt5,QPoint,QFrame,rect,气泡
From: https://www.cnblogs.com/yqbaowo/p/18413971

相关文章

  • PyQt5--打造精美、功能强大的桌面应用程序
    ui文件转换为python文件方法一:直接使用命令行转换,demo.ui为保存的ui名,demo.py为ui转换为python的文件。1python-mPyQt5.uic.pyuicdemo.ui-odemo.py QLabel案例:使用信号以下是QLabel控件的常用信号:linkActivated:当控件中包含超链接时,用户单击链接时触发此信号。......
  • 【看来我要63岁才能退休了】超简单!低耦合!一步在自己PyQt5、PySide6界面中加入文件资源
    【......
  • Pyqt5 实现计算器
    计算器是练习pyqt5的好项目界面设计简单 代码如下:importsysfromPyQt5.QtWidgetsimport*fromPyQt5.QtCoreimportQtclassWindow(QWidget):def__init__(self):super().__init__()self.display=Noneself.buttons=None......
  • Python Pyqt5 将ui文件转换成py文件
    命令行pyuicyour_ui_file.ui-ooutput_file.py如果是虚拟环境,则需要提前进入虚拟环境中执行pyuic命令uitopy文件的使用如果是ui文件转换过来的py文件,不要直接在此py文件中编写代码。如果你的ui文件发生变换就需要重新生成py文件,这个时候新的py文件就会覆盖历史的。正确使......
  • 【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)
    文章目录PyQt5入门级超详细教程前言第4部分:事件处理与信号槽机制4.1什么是信号与槽?4.2信号与槽的基本用法4.3信号与槽的基础示例代码详解:4.4处理不同的信号代码详解:4.5自定义信号与槽代码详解:4.6信号槽的高级用法4.7总结第5部分:文件对话框与文件处理5.1什么......
  • PyQt5
    一、介绍PyQt基于QT库的python封装,是一个图形用户界面(GUI)工具包,允许用户使用python语言创建桌面应用程序。目前,不同版本中,PyQt5是较为流行的版本,支持python2.7和python3.x。PyQt支持两种开发方式,可视化和编程化。-编程式创建界面无需多说,pip安装成功以后,有较深基础功底......
  • 【python】PyQt5中富文本框QTextEdit的详细教程与应用实战
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 【PyQt5 应用程序】PyQt基础组件:按钮
    在任何图形用户界面(GUI)应用程序中,按钮是最基本也是最频繁使用的组件之一。它们是用户与应用程序交互的主要方式之一。在PyQt中,按钮可以通过QPushButton类创建,它提供了丰富的功能,包括显示文本、图像,以及响应点击事件。本节将引导你了解如何在PyQt应用中创建和使用按钮,并通过......
  • 使用pyqt5记录
    方便的windows上位机制作软件图形界面制作使用QtDesigner软件完成图形界面的制作,信号绑定之类的图形界面文件转py文件 使用该命令,在windows命令端下将.ui文件转成.py文件python-mPyQt5.uic.pyuicuntitled.ui-ountitled.py//文件自己修改可选,方便的python文件编辑......
  • Yololov5+Pyqt5+Opencv 实时城市积水报警系统
    在现代城市生活中,积水问题不仅影响交通和人们的日常生活,还可能对城市基础设施造成潜在的威胁。为了快速、准确地识别和应对积水问题,使用计算机视觉技术进行智能积水检测成为一个重要的解决方案。在这篇博客中,我将带你一步步实现一个基于YOLOv5的积水检测系统,帮助你轻松应对城市......