diff --git a/app/components/CAvatar.py b/app/components/CAvatar.py index 71bb3a4..74c0ba7 100644 --- a/app/components/CAvatar.py +++ b/app/components/CAvatar.py @@ -53,6 +53,8 @@ class CAvatar(QWidget): self.setSize(size) if img_bytes: self.setBytes(img_bytes) + + else: self.setUrl(url) @@ -178,10 +180,13 @@ class CAvatar(QWidget): def setBytes(self, img_bytes): self._pixmap = QPixmap() - if img_bytes[:4] == b'\x89PNG': - self._pixmap.loadFromData(img_bytes, format='PNG') - else: - self._pixmap.loadFromData(img_bytes, format='jfif') + if isinstance(img_bytes, bytes): + if img_bytes[:4] == b'\x89PNG': + self._pixmap.loadFromData(img_bytes, format='PNG') + else: + self._pixmap.loadFromData(img_bytes, format='jfif') + elif isinstance(img_bytes, QPixmap): + self._pixmap = img_bytes self._resizePixmap() def setUrl(self, url): diff --git a/app/ui/chat/ai_chat.py b/app/ui/chat/ai_chat.py new file mode 100644 index 0000000..7de4826 --- /dev/null +++ b/app/ui/chat/ai_chat.py @@ -0,0 +1,140 @@ +import sys +import time +import traceback + +from PyQt5.QtCore import QThread, pyqtSignal, QSize, Qt +from PyQt5.QtGui import QPixmap +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout, QApplication, QTextBrowser + +from app.ui.Icon import Icon + +try: + from .chatInfoUi import Ui_Form +except: + from chatInfoUi import Ui_Form +from app.DataBase import msg_db, hard_link_db +from app.components.bubble_message import BubbleMessage, ChatWidget, Notice +from app.person import Me, Contact, ContactDefault + + +class Message(QWidget): + def __init__(self, is_send=False, text='', parent=None): + super().__init__(parent) + self.avatar = QLabel(self) + + self.textBrowser = QTextBrowser(self) + self.textBrowser.setText(text) + + layout = QHBoxLayout(self) + if is_send: + pixmap = Me().avatar.scaled(45, 45) + self.textBrowser.setLayoutDirection(Qt.RightToLeft) + self.textBrowser.setAlignment(Qt.AlignRight | Qt.AlignVCenter) + self.avatar.setPixmap(pixmap) + layout.addWidget(self.textBrowser) + layout.addWidget(self.avatar) + else: + pixmap = QPixmap(Icon.Default_avatar_path).scaled(45, 45) + self.avatar.setPixmap(pixmap) + layout.addWidget(self.avatar) + layout.addWidget(self.textBrowser) + # self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height())) + self.textBrowser.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.avatar.setFixedSize(QSize(60, 60)) + + def append(self, text: str): + self.textBrowser.insertPlainText(text) + self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height())) + + +class AIChat(QWidget, Ui_Form): + def __init__(self, contact, parent=None): + super().__init__(parent) + self.now_message :Message= None + self.setupUi(self) + self.last_timestamp = 0 + self.last_str_time = '' + self.last_pos = 0 + self.contact = contact + self.init_ui() + self.show_chats() + self.pushButton.clicked.connect(self.send_msg) + + def init_ui(self): + self.textEdit.installEventFilter(self) + + def chat(self, text): + self.now_message.append(text) + self.scrollArea.verticalScrollBar().setValue(self.scrollArea.verticalScrollBar().maximum()) + + def send_msg(self): + msg = self.textEdit.toPlainText().strip() + self.textEdit.setText('') + if not msg: + return + print(msg) + bubble_message = BubbleMessage( + msg, + Me().avatar, + 1, + True, + ) + self.verticalLayout_message.addWidget(bubble_message) + message1 = Message(False) + self.verticalLayout_message.addWidget(message1) + self.show_chat_thread.msg = msg + self.now_message = message1 + self.show_chat_thread.start() + + def show_chats(self): + # return + self.show_chat_thread = AIChatThread() + self.show_chat_thread.msgSignal.connect(self.chat) + + def update_history_messages(self): + print('开始发送信息') + message1 = Message(False) + msg = '您好!我是MemoTrace小助手,您可以问我一些问题。' + self.verticalLayout_message.addWidget(message1) + self.show_chat_thread.msg = msg + self.now_message = message1 + self.show_chat_thread.start() + def add_message(self, message): + print('message', message) + # self.textBrowser.append(message) + self.textBrowser.insertPlainText(message) + self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height())) + + def eventFilter(self, obj, event): + if obj == self.textEdit and event.type() == event.KeyPress: + key = event.key() + if key == 16777220: # 回车键的键值 + self.send_msg() + self.textEdit.setText('') + return True + return super().eventFilter(obj, event) + +class AIChatThread(QThread): + msgSignal = pyqtSignal(str) + showSingal = pyqtSignal(tuple) + finishSingal = pyqtSignal(int) + msg_id = 0 + + # heightSingal = pyqtSignal(int) + def __init__(self): + super().__init__() + self.msg = '' + + def run(self) -> None: + for s in self.msg: + self.msgSignal.emit(s) + time.sleep(0.02) + self.finishSingal.emit(1) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + contact = ContactDefault('1') + dialog = AIChat(contact) + dialog.show() + sys.exit(app.exec_()) diff --git a/app/ui/chat/chatInfoUi.py b/app/ui/chat/chatInfoUi.py index 62c03c5..047d7b0 100644 --- a/app/ui/chat/chatInfoUi.py +++ b/app/ui/chat/chatInfoUi.py @@ -2,22 +2,23 @@ # Form implementation generated from reading ui file 'chatInfoUi.ui' # -# Created by: PyQt5 UI code generator 5.15.7 +# Created by: PyQt5 UI code generator 5.15.10 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") - self.verticalLayout = QtWidgets.QVBoxLayout(Form) - self.verticalLayout.setContentsMargins(0, 0, 0, 0) - self.verticalLayout.setSpacing(0) - self.verticalLayout.setObjectName("verticalLayout") + Form.resize(817, 748) + self.horizontalLayout_7 = QtWidgets.QHBoxLayout(Form) + self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_7.setSpacing(0) + self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.frame = QtWidgets.QFrame(Form) self.frame.setFrameShape(QtWidgets.QFrame.NoFrame) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) @@ -35,8 +36,28 @@ class Ui_Form(object): self.toolButton.setObjectName("toolButton") self.horizontalLayout_2.addWidget(self.toolButton) self.verticalLayout_2.addLayout(self.horizontalLayout_2) - - self.verticalLayout.addWidget(self.frame) + self.scrollArea = QtWidgets.QScrollArea(self.frame) + self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.setObjectName("scrollArea") + self.scrollAreaWidgetContents = QtWidgets.QWidget() + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 795, 555)) + self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.verticalLayout_message = QtWidgets.QVBoxLayout() + self.verticalLayout_message.setObjectName("verticalLayout_message") + self.verticalLayout_3.addLayout(self.verticalLayout_message) + self.scrollArea.setWidget(self.scrollAreaWidgetContents) + self.verticalLayout_2.addWidget(self.scrollArea) + self.textEdit = QtWidgets.QTextEdit(self.frame) + self.textEdit.setMaximumSize(QtCore.QSize(16777215, 100)) + self.textEdit.setObjectName("textEdit") + self.verticalLayout_2.addWidget(self.textEdit) + self.pushButton = QtWidgets.QPushButton(self.frame) + self.pushButton.setObjectName("pushButton") + self.verticalLayout_2.addWidget(self.pushButton) + self.horizontalLayout_7.addWidget(self.frame) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) @@ -44,5 +65,6 @@ class Ui_Form(object): def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) - self.label_reamrk.setText(_translate("Form", "TextLabel")) + self.label_reamrk.setText(_translate("Form", "EmoAi")) self.toolButton.setText(_translate("Form", "...")) + self.pushButton.setText(_translate("Form", "发送")) diff --git a/app/ui/chat/chat_window.py b/app/ui/chat/chat_window.py index 9185c89..8a656da 100644 --- a/app/ui/chat/chat_window.py +++ b/app/ui/chat/chat_window.py @@ -1,13 +1,15 @@ import shutil from PyQt5.QtCore import QThread, pyqtSignal +from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QWidget, QMessageBox, QAction, QLineEdit from app.DataBase import micro_msg_db, misc_db, msg_db, close_db from app.components import ContactQListWidgetItem, ScrollBar -from app.person import Contact +from app.person import Contact, Me from app.ui.Icon import Icon from app.util import search +from .ai_chat import AIChat from .chatUi import Ui_Form from .chat_info import ChatInfo @@ -67,6 +69,12 @@ class ChatWindow(QWidget, Ui_Form): self.listWidget.currentRowChanged.connect(self.setCurrentIndex) self.listWidget.setCurrentRow(0) self.stackedWidget.setCurrentIndex(0) + pixmap = QPixmap(Icon.Default_avatar_path).scaled(45, 45) + contact_item = ContactQListWidgetItem('AI小助手', '', pixmap) + self.listWidget.addItem(contact_item) + self.listWidget.setItemWidget(contact_item, contact_item.widget) + chat_info_window = AIChat(Me()) + self.stackedWidget.addWidget(chat_info_window) def show_chats(self): # return