mirror of
https://github.com/LC044/WeChatMsg
synced 2025-02-23 03:22:17 +08:00
Update bubble_message.py
This commit is contained in:
parent
8a4c9a04b7
commit
b306415d37
@ -1,87 +1,183 @@
|
|||||||
from Lib import QtNinePatch2
|
from PIL import Image
|
||||||
|
from PyQt5 import QtGui
|
||||||
from PyQt5.QtCore import Qt, QRectF
|
from PyQt5.QtGui import QPainter, QFont, QColor, QPixmap, QPolygon
|
||||||
from PyQt5.QtGui import QImage, QPainter, QColor, QFont, QPixmap
|
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout, QSizePolicy, QVBoxLayout, QSpacerItem
|
||||||
from PyQt5.QtWidgets import QLabel, QWidget, QHBoxLayout, QVBoxLayout, QSizePolicy
|
from PyQt5.QtCore import QSize, pyqtSignal, Qt, QRectF, QPoint
|
||||||
|
|
||||||
|
|
||||||
class Label(QLabel):
|
class TextMessage(QLabel):
|
||||||
|
heightSingal = pyqtSignal(int)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, text, is_send=False, parent=None):
|
||||||
super(Label, self).__init__()
|
super(TextMessage, self).__init__(text, parent)
|
||||||
# .9 格式的图片
|
self.setFont(QFont('SimSun', 15))
|
||||||
filp = kwargs.get('filp')
|
self.setWordWrap(True)
|
||||||
self.image = QImage('Data/skin_aio_friend_bubble_pressed.9.png')
|
# self.adjustSize()
|
||||||
if filp:
|
self.setMaximumWidth(800)
|
||||||
self.image = self.image.mirrored(True, False)
|
self.setMinimumWidth(100)
|
||||||
self.txt = kwargs.get('text')
|
self.setMinimumHeight(10)
|
||||||
|
# self.resize(QSize(100,40))
|
||||||
|
self.setTextInteractionFlags(Qt.TextSelectableByMouse)
|
||||||
self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
|
self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
|
||||||
self.adjustSize()
|
# self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Minimum)
|
||||||
|
if is_send:
|
||||||
|
self.setAlignment(Qt.AlignCenter | Qt.AlignRight)
|
||||||
|
self.setStyleSheet(
|
||||||
|
'''
|
||||||
|
background-color:white;
|
||||||
|
border-radius:10px;
|
||||||
|
border-top: 10px solid white;
|
||||||
|
border-bottom: 10px solid white;
|
||||||
|
border-right: 10px solid white;
|
||||||
|
border-left: 10px solid white;
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.setStyleSheet(
|
||||||
|
'''
|
||||||
|
background-color:#b2e281;
|
||||||
|
border-radius:10px;
|
||||||
|
border-top: 10px solid #b2e281;
|
||||||
|
border-bottom: 10px solid #b2e281;
|
||||||
|
border-right: 10px solid #b2e281;
|
||||||
|
border-left: 10px solid #b2e281;
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
def showEvent(self, event):
|
def paintEvent(self, a0: QtGui.QPaintEvent) -> None:
|
||||||
super(Label, self).showEvent(event)
|
super(TextMessage, self).paintEvent(a0)
|
||||||
pixmap = QtNinePatch2.createPixmapFromNinePatchImage(
|
|
||||||
self.image, self.width(), self.height())
|
|
||||||
self.setPixmap(pixmap)
|
|
||||||
|
|
||||||
#
|
|
||||||
def paintEvent(self, event) -> None:
|
class Triangle(QLabel):
|
||||||
super(Label, self).paintEvent(event)
|
def __init__(self, Type, is_send=False, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
self.Type = Type
|
||||||
|
self.is_send = is_send
|
||||||
|
self.setFixedSize(6, 45)
|
||||||
|
|
||||||
|
def paintEvent(self, a0: QtGui.QPaintEvent) -> None:
|
||||||
|
super(Triangle, self).paintEvent(a0)
|
||||||
|
if self.Type == 3:
|
||||||
painter = QPainter(self)
|
painter = QPainter(self)
|
||||||
painter.begin(self)
|
triangle = QPolygon()
|
||||||
painter.setPen(QColor(150, 100, 23))
|
# print(self.width(), self.height())
|
||||||
painter.setFont(QFont('SimSun', 20))
|
if self.is_send:
|
||||||
painter.setRenderHint(QPainter.Antialiasing)
|
painter.setPen(QColor('white'))
|
||||||
painter.setRenderHint(QPainter.SmoothPixmapTransform)
|
painter.setBrush(QColor('white'))
|
||||||
rec = QRectF(30, 40, self.width() - 60, self.height() - 60)
|
triangle.setPoints(0, 20, 0, 35, 6, 25)
|
||||||
painter.drawText(rec, Qt.TextWordWrap, self.txt)
|
else:
|
||||||
painter.end()
|
painter.setPen(QColor('#b2e281'))
|
||||||
|
painter.setBrush(QColor('#b2e281'))
|
||||||
|
triangle.setPoints(0, 25, 6, 20, 6, 35)
|
||||||
|
painter.drawPolygon(triangle)
|
||||||
|
|
||||||
#
|
|
||||||
def resizeEvent(self, event):
|
class Avatar(QLabel):
|
||||||
super(Label, self).resizeEvent(event)
|
def __init__(self, avatar, parent=None):
|
||||||
pixmap = QtNinePatch2.createPixmapFromNinePatchImage(
|
super().__init__(parent)
|
||||||
self.image, self.width(), self.height())
|
if isinstance(avatar, str):
|
||||||
self.setPixmap(pixmap)
|
self.setPixmap(QPixmap(avatar).scaled(45, 45))
|
||||||
|
self.image_path = avatar
|
||||||
|
elif isinstance(avatar, QPixmap):
|
||||||
|
self.setPixmap(avatar)
|
||||||
|
self.setMaximumWidth(45)
|
||||||
|
self.setMaximumHeight(45)
|
||||||
|
|
||||||
|
|
||||||
|
class ImageMessage(QLabel):
|
||||||
|
def __init__(self, avatar, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
self.image_path = './Data/head.jpg'
|
||||||
|
self.image = QLabel(self)
|
||||||
|
if isinstance(avatar, str):
|
||||||
|
self.setPixmap(QPixmap(avatar))
|
||||||
|
self.image_path = avatar
|
||||||
|
elif isinstance(avatar, QPixmap):
|
||||||
|
self.setPixmap(avatar)
|
||||||
|
self.setMaximumWidth(480)
|
||||||
|
self.setMaximumHeight(720)
|
||||||
|
# self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
||||||
|
# self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
|
||||||
|
# self.setScaledContents(True)
|
||||||
|
|
||||||
|
# def paintEvent(self, a0) -> None:
|
||||||
|
# painter = QPainter(self)
|
||||||
|
# painter.begin(self)
|
||||||
|
# # self.setPixmap()
|
||||||
|
# painter.end()
|
||||||
|
|
||||||
|
def mousePressEvent(self, event):
|
||||||
|
if event.buttons() == Qt.LeftButton: # 左键按下
|
||||||
|
image = Image.open(self.image_path)
|
||||||
|
image.show()
|
||||||
|
|
||||||
|
|
||||||
class BubbleMessage(QWidget):
|
class BubbleMessage(QWidget):
|
||||||
def __init__(self, text, avatar, isSend=False, parent=None):
|
def __init__(self, str_content, avatar, Type, is_send=False, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.isSend = isSend
|
self.isSend = is_send
|
||||||
|
|
||||||
self.txt = text
|
|
||||||
layout = QHBoxLayout()
|
layout = QHBoxLayout()
|
||||||
self.avatar = QLabel()
|
layout.setSpacing(0)
|
||||||
self.avatar.setPixmap(avatar)
|
self.avatar = Avatar(avatar)
|
||||||
self.message = Label(text=text, filp=isSend)
|
triangle = Triangle(Type,is_send)
|
||||||
if isSend:
|
if Type == 3:
|
||||||
layout.addWidget(self.message)
|
self.message = TextMessage(str_content, is_send)
|
||||||
layout.addWidget(self.avatar, 0, Qt.AlignTop)
|
else:
|
||||||
|
self.message = ImageMessage(str_content)
|
||||||
|
# skin_aio_friend_bubble_pressed.9
|
||||||
|
'''
|
||||||
|
border-image:url(./Data/截图222.png) 20 20 20 20;
|
||||||
|
border-top: 5px transparent;
|
||||||
|
border-bottom: 5px transparent;
|
||||||
|
border-right: 5px transparent;
|
||||||
|
border-left: 5px transparent;
|
||||||
|
border-radius:10px;
|
||||||
|
'''
|
||||||
|
self.spacerItem = QSpacerItem(65, 65, QSizePolicy.Expanding, QSizePolicy.Minimum)
|
||||||
|
if is_send:
|
||||||
|
layout.addItem(self.spacerItem)
|
||||||
|
layout.addWidget(self.message, 10)
|
||||||
|
layout.addWidget(triangle,0,Qt.AlignTop | Qt.AlignLeft)
|
||||||
|
layout.addWidget(self.avatar, 0, Qt.AlignTop | Qt.AlignLeft)
|
||||||
layout.setStretch(0, 1)
|
layout.setStretch(0, 1)
|
||||||
else:
|
else:
|
||||||
layout.addWidget(self.avatar, 0, Qt.AlignTop)
|
layout.addWidget(self.avatar, 0, Qt.AlignTop | Qt.AlignRight)
|
||||||
layout.addWidget(self.message)
|
layout.addWidget(triangle, 0, Qt.AlignTop | Qt.AlignRight)
|
||||||
layout.setStretch(1, 1)
|
layout.addWidget(self.message, 10)
|
||||||
|
layout.addItem(self.spacerItem)
|
||||||
|
layout.setStretch(3, 1)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
def resizeEvent(self, a0) -> None:
|
|
||||||
w = (self.message.width() - 60) // 27
|
|
||||||
row = int(len(self.txt) // w) + 1
|
|
||||||
print('row', row)
|
|
||||||
self.message.setMaximumHeight(row * 31 + 80)
|
|
||||||
return
|
|
||||||
|
|
||||||
|
class MyWidget(QWidget):
|
||||||
class MainWindow(QWidget):
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例'''
|
txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例'''
|
||||||
avatar = QPixmap('Data/head.jpg').scaled(60, 60)
|
avatar = 'Data/head.jpg'
|
||||||
bubble_mesage = BubbleMessage(txt, avatar, isSend=False)
|
bubble_message = BubbleMessage(txt, avatar, Type=3, is_send=False)
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
bubble_mesage1 = BubbleMessage(txt, avatar, isSend=True)
|
txt = "你说啥"
|
||||||
layout.addWidget(bubble_mesage)
|
avatar_2 = 'Data/fg1.png'
|
||||||
layout.addWidget(bubble_mesage1)
|
bubble_message1 = BubbleMessage(txt, avatar_2, Type=3, is_send=True)
|
||||||
|
layout.addWidget(bubble_message)
|
||||||
|
layout.addWidget(bubble_message1)
|
||||||
|
bubble_message2 = BubbleMessage('', avatar_2, Type=3, is_send=True)
|
||||||
|
layout.addWidget(bubble_message2)
|
||||||
|
txt = "我啥都没说"
|
||||||
|
avatar0 = 'Data/fg1.png'
|
||||||
|
bubble_message1 = BubbleMessage('Data/fg1.png', avatar, Type=1, is_send=False)
|
||||||
|
layout.addWidget(bubble_message1)
|
||||||
|
self.spacerItem = QSpacerItem(65, 65, QSizePolicy.Minimum, QSizePolicy.Expanding)
|
||||||
|
layout.addItem(self.spacerItem)
|
||||||
# layout.setStretch(0, 1)
|
# layout.setStretch(0, 1)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
# def resizeEvent(self, a0) -> None:
|
||||||
|
# return
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = QApplication([])
|
||||||
|
widget = MyWidget()
|
||||||
|
widget.show()
|
||||||
|
app.exec_()
|
||||||
|
Loading…
Reference in New Issue
Block a user