From a248146e83b661f9ddd93edc643d9c9c4b5d3159 Mon Sep 17 00:00:00 2001 From: shuaikangzhou <863909694@qq.com> Date: Sat, 18 Nov 2023 13:25:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E6=B6=88=E6=81=AF=E8=87=AA?= =?UTF-8?q?=E9=80=82=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 72 ++++++++++++++++---------------- app/DataBase/msg.py | 17 ++++---- app/components/bubble_message.py | 72 +++++++++++--------------------- app/ui_pc/chat/chat_info.py | 60 ++++++++++++++++---------- 4 files changed, 108 insertions(+), 113 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 84098d1..8323c16 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,13 +4,11 @@ - @@ -680,7 +677,8 @@ - diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py index 6ddfaa4..e15b142 100644 --- a/app/DataBase/msg.py +++ b/app/DataBase/msg.py @@ -2,6 +2,7 @@ import os.path import re import sqlite3 import threading +from pprint import pprint DB = [] cursor = [] @@ -56,22 +57,21 @@ def get_messages(username_): return result -def get_message_by_num(username_, n): +def get_message_by_num(username_, local_id): sql = ''' select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime from MSG - where StrTalker=? - order by CreateTime desc - limit 100 + where StrTalker = ? and localId < ? + order by CreateTime desc + limit 30 ''' result = [] try: lock.acquire(True) for cur in cursor: cur = cursor[-1] - cur.execute(sql, [username_]) + cur.execute(sql, [username_, local_id]) result_ = cur.fetchall() - result_.reverse() result += result_ return result_ finally: @@ -93,5 +93,8 @@ if __name__ == '__main__': # result = get_messages(username) # pprint(result) # pprint(len(result)) - result = get_message_by_num('wxid_0o18ef858vnu22', 0) + result = get_message_by_num('wxid_0o18ef858vnu22', 9999999) print(result) + print(result[-1][0]) + local_id = result[-1][0] + pprint(get_message_by_num('wxid_0o18ef858vnu22', local_id)) diff --git a/app/components/bubble_message.py b/app/components/bubble_message.py index c6357ef..517f600 100644 --- a/app/components/bubble_message.py +++ b/app/components/bubble_message.py @@ -140,6 +140,7 @@ class BubbleMessage(QWidget): layout = QHBoxLayout() layout.setSpacing(0) layout.setContentsMargins(0, 5, 5, 5) + # self.resize(QSize(200, 50)) self.avatar = Avatar(avatar) triangle = Triangle(Type, is_send) if Type == 1: @@ -173,35 +174,20 @@ class BubbleMessage(QWidget): class ScrollAreaContent(QWidget): def __init__(self, parent=None): super().__init__(parent) - # self.setStyleSheet( - # ''' - # background-color:rgb(127,127,127); - # ''' - # ) - - def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: - # print(self.width(),self.height()) - self.setMinimumSize(self.width(), self.height()) + self.adjustSize() class ScrollArea(QScrollArea): def __init__(self, parent=None): super().__init__(parent) self.setWidgetResizable(True) + self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setStyleSheet( ''' border:none; ''' ) - def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: - # return - self.widget().setMinimumSize(self.width(), self.widget().height()) - self.widget().setMaximumSize(self.width(), self.widget().height()) - self.widget().resize(QSize(self.width(), self.widget().height())) - - -# class ScrollBar(QScrollBar): def __init__(self): @@ -254,57 +240,41 @@ class ChatWidget(QWidget): def __init__(self): super().__init__() self.resize(500, 200) - txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例''' - avatar = './app/data/icons/default_avatar.svg' - bubble_message = BubbleMessage(txt, avatar, Type=1, is_send=False) + layout = QVBoxLayout() layout.setSpacing(0) - + self.adjustSize() # 生成滚动区域 - self.scrollArea = ScrollArea() - self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.scrollArea = ScrollArea(self) scrollBar = ScrollBar() self.scrollArea.setVerticalScrollBar(scrollBar) # self.scrollArea.setGeometry(QRect(9, 9, 261, 211)) # 生成滚动区域的内容部署层部件 - self.scrollAreaWidgetContents = ScrollAreaContent() + self.scrollAreaWidgetContents = ScrollAreaContent(self.scrollArea) self.scrollAreaWidgetContents.setMinimumSize(50, 100) # 设置滚动区域的内容部署部件为前面生成的内容部署层部件 self.scrollArea.setWidget(self.scrollAreaWidgetContents) layout.addWidget(self.scrollArea) self.layout0 = QVBoxLayout() self.layout0.setSpacing(0) - # self.layout0.addWidget(bubble_message) - # self.scrollArea.setLayout(layout0) self.scrollAreaWidgetContents.setLayout(self.layout0) - - time = Notice("2023-11-17 15:44") - # self.layout0.addWidget(time) - # txt = "你说啥" - # avatar_2 = '../data/icons/default_avatar.svg' - # bubble_message1 = BubbleMessage(txt, avatar_2, Type=1, is_send=True) - # - # self.layout0.addWidget(bubble_message1) - # - # bubble_message2 = BubbleMessage('', avatar_2, Type=1, is_send=True) - # self.layout0.addWidget(bubble_message2) - # txt = "我啥都没说" - # avatar0 = 'Data/fg1.png' - bubble_message1 = BubbleMessage("D:\Project\Python\PyQt-master\QLabel\Data\\fg1.png", avatar, Type=3, - is_send=False) - self.layout0.addWidget(bubble_message1) - - self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) - self.layout0.addItem(self.spacerItem) - # layout.setStretch(0, 1) self.setLayout(layout) - def add_message_item(self, bubble_message): - self.layout0.addWidget(bubble_message) + def add_message_item(self, bubble_message, index=1): + if index: + self.layout0.addWidget(bubble_message) + else: + self.layout0.insertWidget(0, bubble_message) def set_scroll_bar_last(self): self.scrollArea.verticalScrollBar().setValue(self.scrollArea.widget().height()) + def set_scroll_bar_value(self, val): + self.verticalScrollBar().setValue(val) + + def verticalScrollBar(self): + return self.scrollArea.verticalScrollBar() + class Test(QWidget): def __init__(self): @@ -318,6 +288,12 @@ class Test(QWidget): Type=1, ) w1.add_message_item(bm1) + for i in range(10): + txt = '''在工具中单击边缘可以添加黑点,单击可以删掉黑点,拖动可以调整黑点长度。勾选等选项可以查看内容、缩放等区域右侧可预览不同拉伸情况下的效果,拖动可以调整预览的拉伸比例''' + avatar = '../data/icons/default_avatar.svg' + bubble_message = BubbleMessage(txt, avatar, Type=1, is_send=False) + print(bubble_message.height(), '高度') + w1.add_message_item(bubble_message, 0) w2 = QLabel("nihao") layout.addWidget(w1) layout.addWidget(w2) diff --git a/app/ui_pc/chat/chat_info.py b/app/ui_pc/chat/chat_info.py index f765eae..5cb18b2 100644 --- a/app/ui_pc/chat/chat_info.py +++ b/app/ui_pc/chat/chat_info.py @@ -1,14 +1,15 @@ -from PyQt5.QtCore import QThread, pyqtSignal, Qt +from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout from app.DataBase import msg -from app.components.bubble_message import BubbleMessage, ScrollBar, ScrollArea, ScrollAreaContent, ChatWidget +from app.components.bubble_message import BubbleMessage, ChatWidget from app.person import MePC class ChatInfo(QWidget): def __init__(self, contact, parent=None): super().__init__(parent) + self.last_pos = 0 self.contact = contact self.init_ui() @@ -25,22 +26,8 @@ class ChatInfo(QWidget): self.vBoxLayout.addLayout(self.hBoxLayout) self.chat_window = ChatWidget() + self.chat_window.scrollArea.verticalScrollBar().valueChanged.connect(self.verticalScrollBar) self.vBoxLayout.addWidget(self.chat_window) - return - - self.scrollArea = ScrollArea() - self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - scrollBar = ScrollBar() - self.scrollArea.setVerticalScrollBar(scrollBar) - - self.scrollAreaWidgetContents = ScrollAreaContent() - self.scrollAreaWidgetContents.setMinimumSize(200, 400) - self.scrollArea.setWidget(self.scrollAreaWidgetContents) - - self.vBoxLayout.addWidget(self.scrollArea) - self.scroolAreaLayout = QVBoxLayout() - self.scroolAreaLayout.setSpacing(0) - self.scrollAreaWidgetContents.setLayout(self.scroolAreaLayout) def show_chats(self): self.show_chat_thread = ShowChatThread(self.contact) @@ -52,7 +39,32 @@ class ChatInfo(QWidget): # self.spacerItem = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) # self.scroolAreaLayout.addItem(self.spacerItem) self.setLayout(self.vBoxLayout) - self.chat_window.set_scroll_bar_last() + self.setScrollBarPos() + + def verticalScrollBar(self, pos): + """ + 滚动条到0之后自动更新聊天记录 + :param pos: + :return: + """ + # print(pos) + if pos > 0: + return + self.last_pos = self.chat_window.verticalScrollBar().maximum() + print('记录当前滚动条位置:', self.last_pos) + self.show_chat_thread.start() + + def setScrollBarPos(self): + """ + 将滚动条位置设置为上次看到的地方 + :param pos: + :return: + """ + print('上次滚动条位置', self.last_pos) + pos = self.chat_window.verticalScrollBar().maximum() - self.last_pos + + print('当前滚动条位置:', pos) + self.chat_window.set_scroll_bar_value(pos) def show_chat(self, message): try: @@ -62,15 +74,16 @@ class ChatInfo(QWidget): avatar = MePC().avatar if is_send else self.contact.avatar if type_ == 1: str_content = message[7] + str_time = message[8] bubble_message = BubbleMessage( - str_content, + str_time + ' ' + str_content, avatar, type_, is_send ) # print(str_content) # self.scroolAreaLayout.addWidget(bubble_message) - self.chat_window.add_message_item(bubble_message) + self.chat_window.add_message_item(bubble_message, 0) except: print(message) @@ -78,14 +91,19 @@ class ChatInfo(QWidget): class ShowChatThread(QThread): showSingal = pyqtSignal(tuple) finishSingal = pyqtSignal(int) + msg_id = 0 # heightSingal = pyqtSignal(int) def __init__(self, contact): super().__init__() + self.last_message_id = 9999999 self.wxid = contact.wxid def run(self) -> None: - messages = msg.get_message_by_num(self.wxid, 0) + messages = msg.get_message_by_num(self.wxid, self.last_message_id) + if messages: + self.last_message_id = messages[-1][0] for message in messages: self.showSingal.emit(message) + self.msg_id += 1 self.finishSingal.emit(1)