mirror of
https://github.com/LC044/WeChatMsg
synced 2025-02-23 03:22:17 +08:00
新增ai对话前端
This commit is contained in:
parent
e4700f50f9
commit
7f79936383
@ -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 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):
|
||||
|
140
app/ui/chat/ai_chat.py
Normal file
140
app/ui/chat/ai_chat.py
Normal file
@ -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_())
|
@ -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", "发送"))
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user