新增ai对话前端

This commit is contained in:
shuaikangzhou 2024-02-06 16:57:46 +08:00
parent e4700f50f9
commit 7f79936383
4 changed files with 189 additions and 14 deletions

View File

@ -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):

140
app/ui/chat/ai_chat.py Normal file
View 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_())

View File

@ -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", "发送"))

View File

@ -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