diff --git a/app/Ui/contact/__init__.py b/app/Ui/contact/__init__.py new file mode 100644 index 0000000..fa6c268 --- /dev/null +++ b/app/Ui/contact/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +""" +@File : __init__.py.py +@Author : Shuaikang Zhou +@Time : 2022/12/13 20:33 +@IDE : Pycharm +@Version : Python3.10 +@comment : ··· +""" diff --git a/app/Ui/contact/contact.py b/app/Ui/contact/contact.py new file mode 100644 index 0000000..aa60203 --- /dev/null +++ b/app/Ui/contact/contact.py @@ -0,0 +1,250 @@ +# -*- coding: utf-8 -*- +""" +@File : mainview.py +@Author : Shuaikang Zhou +@Time : 2022/12/13 15:07 +@IDE : Pycharm +@Version : Python3.10 +@comment : ··· +""" +import os.path +import socket # 导入socket模块 +import datetime +import json +import time + +import xmltodict +from PIL import Image +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from .contactUi import * +from ...DataBase import data, output +from ...ImageBox.ui import MainDemo +from .userinfo import userinfoUi + + +class ContactController(QWidget, Ui_Dialog): + exitSignal = pyqtSignal() + urlSignal = pyqtSignal(QUrl) + + # username = '' + + def __init__(self, Me, parent=None): + super(ContactController, self).__init__(parent) + self.chatroomFlag = None + self.ta_avatar = None + self.setupUi(self) + self.setWindowTitle('WeChat') + self.setWindowIcon(QIcon('./app/data/icon.png')) + self.initui() + self.Me = Me + self.Thread = ChatMsg(self.Me.username, None) + self.contacts = {} + self.last_btn = None + self.chat_flag = True + self.show_flag = False + self.ta_username = None + self.last_pos = 0 + self.last_msg_time = 0 # 上次信息的时间 + self.last_talkerId = None + self.now_talkerId = None + self.showContact() + self.userinfo = userinfoUi.Ui_Frame() + self.userinfo.setupUi(self.frame) + self.userinfo.btn_outbut.clicked.connect(self.output) + + def initui(self): + self.qurl = QUrl('baidu.com') + # self.urlSignal.connect(self.hyperlink) + # self.message.setOpenLinks(False) + # self.message.setOpenExternalLinks(False) + + def showContact(self): + """ + 显示聊天界面 + :return: + """ + print('show') + if self.show_flag: + return + self.show_flag = True + rconversations = data.get_rconversation() + max_hight = max(len(rconversations) * 80, 680) + self.scrollAreaWidgetContents.setGeometry( + QtCore.QRect(0, 0, 300, max_hight)) + for i in range(len(rconversations)): + rconversation = rconversations[i] + username = rconversation[1] + # print('联系人:', i, rconversation) + pushButton_2 = Contact(self.scrollAreaWidgetContents, i, rconversation) + pushButton_2.setGeometry(QtCore.QRect(0, 80 * i, 300, 80)) + pushButton_2.setLayoutDirection(QtCore.Qt.LeftToRight) + pushButton_2.clicked.connect(pushButton_2.show_msg) + pushButton_2.usernameSingal.connect(self.Contact) + self.contacts[username] = pushButton_2 + + def Contact(self, talkerId): + """ + 聊天界面 点击联系人头像时候显示聊天数据 + :param talkerId: + :return: + """ + self.now_talkerId = talkerId + # 把当前按钮设置为灰色 + if self.last_talkerId and self.last_talkerId != talkerId: + print('对方账号:', self.last_talkerId) + self.contacts[self.last_talkerId].setStyleSheet( + "QPushButton {background-color: rgb(253,253,253);}" + "QPushButton:hover{background-color: rgb(209,209,209);}\n" + ) + self.last_talkerId = talkerId + self.contacts[talkerId].setStyleSheet( + "QPushButton {background-color: rgb(198,198,198);}" + "QPushButton:hover{background-color: rgb(209,209,209);}\n" + ) + conRemark = data.get_conRemark(talkerId) + nickname, alias = data.get_nickname(talkerId) + self.label_remark.setText(conRemark) + self.ta_username = talkerId + if '@chatroom' in talkerId: + self.chatroomFlag = True + else: + self.chatroomFlag = False + self.ta_avatar = data.get_avator(talkerId) + self.userinfo.l_remark.setText(conRemark) + pixmap = QPixmap(self.ta_avatar).scaled(60, 60) # 按指定路径找到图片 + self.userinfo.l_avatar.setPixmap(pixmap) + self.userinfo.l_nickname.setText(f'昵称:{nickname}') + self.userinfo.l_username.setText(f'微信号:{alias}') + self.userinfo.lineEdit.setText(conRemark) + + def closeEvent(self, a0: QtGui.QCloseEvent) -> None: + print("closed") + self.exitSignal.emit() + self.close() + + def output(self): + self.outputThread = output.Output(self.Me, self.now_talkerId) + self.outputThread.start() + + +class Contact(QtWidgets.QPushButton): + """ + 联系人类,继承自pyqt的按钮,里面封装了联系人头像等标签 + """ + usernameSingal = pyqtSignal(str) + + def __init__(self, Ui, id=None, contact=None): + super(Contact, self).__init__(Ui) + self.layoutWidget = QtWidgets.QWidget(Ui) + self.layoutWidget.setObjectName("layoutWidget") + self.gridLayout1 = QtWidgets.QGridLayout(self.layoutWidget) + self.gridLayout1.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) + self.gridLayout1.setContentsMargins(10, 10, 10, 10) + self.gridLayout1.setSpacing(10) + self.gridLayout1.setObjectName("gridLayout1") + self.label_time = QtWidgets.QLabel(self.layoutWidget) + font = QtGui.QFont() + font.setPointSize(8) + self.label_time.setFont(font) + self.label_time.setLayoutDirection(QtCore.Qt.RightToLeft) + self.label_time.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) + self.label_time.setObjectName("label_time") + self.gridLayout1.addWidget(self.label_time, 0, 2, 1, 1) + self.label_remark = QtWidgets.QLabel(self.layoutWidget) + font = QtGui.QFont() + font.setFamily("Adobe 黑体 Std R") + font.setPointSize(10) + self.label_remark.setFont(font) + self.label_remark.setObjectName("label_remark") + self.gridLayout1.addWidget(self.label_remark, 0, 1, 1, 1) + self.label_msg = QtWidgets.QLabel(self.layoutWidget) + font = QtGui.QFont() + font.setPointSize(8) + self.label_msg.setFont(font) + self.label_msg.setObjectName("label_msg") + self.gridLayout1.addWidget(self.label_msg, 1, 1, 1, 2) + self.label_avatar = QtWidgets.QLabel(self.layoutWidget) + self.label_avatar.setMinimumSize(QtCore.QSize(60, 60)) + self.label_avatar.setMaximumSize(QtCore.QSize(60, 60)) + self.label_avatar.setLayoutDirection(QtCore.Qt.RightToLeft) + self.label_avatar.setAutoFillBackground(False) + self.label_avatar.setStyleSheet("background-color: #ffffff;") + self.label_avatar.setInputMethodHints(QtCore.Qt.ImhNone) + self.label_avatar.setFrameShape(QtWidgets.QFrame.NoFrame) + self.label_avatar.setFrameShadow(QtWidgets.QFrame.Plain) + self.label_avatar.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) + self.label_avatar.setObjectName("label_avatar") + self.gridLayout1.addWidget(self.label_avatar, 0, 0, 2, 1) + self.gridLayout1.setColumnStretch(0, 1) + self.gridLayout1.setColumnStretch(1, 6) + self.gridLayout1.setRowStretch(0, 5) + self.gridLayout1.setRowStretch(1, 3) + self.setLayout(self.gridLayout1) + self.setStyleSheet( + "QPushButton {background-color: rgb(253,253,253);}" + "QPushButton:hover{background-color: rgb(209,209,209);}\n" + ) + self.msgCount = contact[0] + self.username = contact[1] + self.conversationTime = contact[6] + self.msgType = contact[7] + self.digest = contact[8] + hasTrunc = contact[10] + attrflag = contact[11] + if hasTrunc == 0: + if attrflag == 0: + self.digest = '[动画表情]' + elif attrflag == 67108864: + try: + remark = data.get_conRemark(contact[9]) + msg = self.digest.split(':')[1].strip('\n').strip() + self.digest = f'{remark}:{msg}' + except Exception as e: + # print(self.digest) + # print(e) + pass + else: + pass + self.show_info(id) + + def show_info(self, id): + avatar = data.get_avator(self.username) + # print(avatar) + remark = data.get_conRemark(self.username) + time = datetime.datetime.now().strftime("%m-%d %H:%M") + msg = '还没说话' + pixmap = QPixmap(avatar).scaled(60, 60) # 按指定路径找到图片 + self.label_avatar.setPixmap(pixmap) # 在label上显示图片 + self.label_remark.setText(remark) + self.label_msg.setText(self.digest) + self.label_time.setText(data.timestamp2str(self.conversationTime)[2:]) + + def show_msg(self): + self.usernameSingal.emit(self.username) + + +class ChatMsg(QThread): + """ + 发送信息线程 + """ + isSend_signal = pyqtSignal(tuple) + okSignal = pyqtSignal(int) + + def __init__(self, my_u, ta_u, parent=None): + super().__init__(parent) + self.sec = 2 # 默认1000秒 + self.my_u = my_u + self.ta_u = ta_u + self.my_avatar = data.get_avator(my_u) + self.msg_id = 0 + + def run(self): + self.ta_avatar = data.get_avator(self.ta_u) + messages = data.get_message(self.ta_u, self.msg_id) + # messages.reverse() + for message in messages: + self.isSend_signal.emit(message) + self.msg_id += 1 + self.okSignal.emit(1) diff --git a/app/Ui/contact/contactUi.py b/app/Ui/contact/contactUi.py new file mode 100644 index 0000000..859d002 --- /dev/null +++ b/app/Ui/contact/contactUi.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'contactUi.ui' +# +# Created by: PyQt5 UI code generator 5.15.7 +# +# 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, QtGui, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(1120, 720) + Dialog.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) + Dialog.setAutoFillBackground(False) + self.frame_2 = QtWidgets.QFrame(Dialog) + self.frame_2.setGeometry(QtCore.QRect(0, 0, 1120, 720)) + self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) + self.frame_2.setObjectName("frame_2") + self.scrollArea = QtWidgets.QScrollArea(self.frame_2) + self.scrollArea.setEnabled(True) + self.scrollArea.setGeometry(QtCore.QRect(0, 40, 326, 680)) + self.scrollArea.setMaximumSize(QtCore.QSize(400, 150000)) + self.scrollArea.setAutoFillBackground(False) + self.scrollArea.setFrameShape(QtWidgets.QFrame.WinPanel) + self.scrollArea.setFrameShadow(QtWidgets.QFrame.Raised) + self.scrollArea.setMidLineWidth(0) + self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) + self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.scrollArea.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContentsOnFirstShow) + self.scrollArea.setWidgetResizable(False) + self.scrollArea.setObjectName("scrollArea") + self.scrollAreaWidgetContents = QtWidgets.QWidget() + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 300, 12000)) + self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") + self.pushButton_2 = QtWidgets.QPushButton(self.scrollAreaWidgetContents) + self.pushButton_2.setGeometry(QtCore.QRect(0, 0, 300, 80)) + self.pushButton_2.setLayoutDirection(QtCore.Qt.LeftToRight) + self.pushButton_2.setAutoFillBackground(False) + self.pushButton_2.setText("") + self.pushButton_2.setIconSize(QtCore.QSize(80, 80)) + self.pushButton_2.setObjectName("pushButton_2") + self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents) + self.label.setGeometry(QtCore.QRect(220, 10, 72, 15)) + self.label.setObjectName("label") + self.scrollArea.setWidget(self.scrollAreaWidgetContents) + self.frame = QtWidgets.QFrame(self.frame_2) + self.frame.setGeometry(QtCore.QRect(321, 0, 801, 720)) + self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Raised) + self.frame.setObjectName("frame") + self.line_3 = QtWidgets.QFrame(self.frame) + self.line_3.setGeometry(QtCore.QRect(2, 0, 3, 720)) + self.line_3.setLineWidth(6) + self.line_3.setFrameShape(QtWidgets.QFrame.VLine) + self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_3.setObjectName("line_3") + self.line_2 = QtWidgets.QFrame(self.frame) + self.line_2.setGeometry(QtCore.QRect(9, 30, 831, 20)) + self.line_2.setFrameShape(QtWidgets.QFrame.HLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_2.setObjectName("line_2") + self.label_remark = QtWidgets.QLabel(self.frame) + self.label_remark.setGeometry(QtCore.QRect(30, 0, 351, 41)) + font = QtGui.QFont() + font.setPointSize(12) + self.label_remark.setFont(font) + self.label_remark.setText("") + self.label_remark.setObjectName("label_remark") + self.line = QtWidgets.QFrame(self.frame) + self.line.setGeometry(QtCore.QRect(20, 580, 800, 3)) + self.line.setFrameShape(QtWidgets.QFrame.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line.setObjectName("line") + + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.label.setText(_translate("Dialog", "TextLabel")) diff --git a/app/Ui/contact/contactUi.ui b/app/Ui/contact/contactUi.ui new file mode 100644 index 0000000..077a18a --- /dev/null +++ b/app/Ui/contact/contactUi.ui @@ -0,0 +1,208 @@ + + + Dialog + + + + 0 + 0 + 1120 + 720 + + + + ArrowCursor + + + Dialog + + + false + + + + + 0 + 0 + 1120 + 720 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + true + + + + 0 + 40 + 326 + 680 + + + + + 400 + 150000 + + + + false + + + QFrame::WinPanel + + + QFrame::Raised + + + 0 + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAlwaysOff + + + QAbstractScrollArea::AdjustToContentsOnFirstShow + + + false + + + + + 0 + 0 + 300 + 12000 + + + + + + 0 + 0 + 300 + 80 + + + + Qt::LeftToRight + + + false + + + + + + + 80 + 80 + + + + + + + 220 + 10 + 72 + 15 + + + + TextLabel + + + + + + + + 321 + 0 + 801 + 720 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 2 + 0 + 3 + 720 + + + + 6 + + + Qt::Vertical + + + + + + 9 + 30 + 831 + 20 + + + + Qt::Horizontal + + + + + + 30 + 0 + 351 + 41 + + + + + 12 + + + + + + + + + + 20 + 580 + 800 + 3 + + + + Qt::Horizontal + + + + + + + + diff --git a/app/Ui/contact/userinfo/__init__.py b/app/Ui/contact/userinfo/__init__.py new file mode 100644 index 0000000..6d32454 --- /dev/null +++ b/app/Ui/contact/userinfo/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +""" +@File : __init__.py.py +@Author : Shuaikang Zhou +@Time : 2022/12/24 10:34 +@IDE : Pycharm +@Version : Python3.10 +@comment : ··· +""" diff --git a/app/Ui/contact/userinfo/userinfoUi.py b/app/Ui/contact/userinfo/userinfoUi.py new file mode 100644 index 0000000..ec1c7dc --- /dev/null +++ b/app/Ui/contact/userinfo/userinfoUi.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'userinfoUi.ui' +# +# Created by: PyQt5 UI code generator 5.15.7 +# +# 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, QtGui, QtWidgets + + +class Ui_Frame(object): + def setupUi(self, Frame): + Frame.setObjectName("Frame") + Frame.resize(800, 720) + Frame.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor)) + Frame.setMouseTracking(True) + Frame.setTabletTracking(True) + self.layoutWidget = QtWidgets.QWidget(Frame) + self.layoutWidget.setGeometry(QtCore.QRect(210, 100, 429, 82)) + self.layoutWidget.setObjectName("layoutWidget") + self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.l_avatar = QtWidgets.QLabel(self.layoutWidget) + self.l_avatar.setMinimumSize(QtCore.QSize(80, 80)) + self.l_avatar.setMaximumSize(QtCore.QSize(80, 80)) + self.l_avatar.setText("") + self.l_avatar.setPixmap(QtGui.QPixmap("../../../a_img/be0fa6c0c4707fb5f7b37b660de826d3.jpg")) + self.l_avatar.setScaledContents(True) + self.l_avatar.setObjectName("l_avatar") + self.gridLayout.addWidget(self.l_avatar, 0, 0, 3, 1) + self.l_remark = QtWidgets.QLabel(self.layoutWidget) + font = QtGui.QFont() + font.setPointSize(15) + self.l_remark.setFont(font) + self.l_remark.setObjectName("l_remark") + self.gridLayout.addWidget(self.l_remark, 0, 1, 1, 1) + self.l_nickname = QtWidgets.QLabel(self.layoutWidget) + self.l_nickname.setObjectName("l_nickname") + self.gridLayout.addWidget(self.l_nickname, 1, 1, 1, 1) + self.l_username = QtWidgets.QLabel(self.layoutWidget) + self.l_username.setObjectName("l_username") + self.gridLayout.addWidget(self.l_username, 2, 1, 1, 1) + self.horizontalLayoutWidget = QtWidgets.QWidget(Frame) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(210, 210, 429, 71)) + self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setObjectName("horizontalLayout") + self.label = QtWidgets.QLabel(self.horizontalLayoutWidget) + self.label.setMinimumSize(QtCore.QSize(80, 0)) + self.label.setMaximumSize(QtCore.QSize(80, 16777215)) + font = QtGui.QFont() + font.setPointSize(15) + self.label.setFont(font) + self.label.setObjectName("label") + self.horizontalLayout.addWidget(self.label) + self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget) + self.lineEdit.setMinimumSize(QtCore.QSize(0, 25)) + self.lineEdit.setMaximumSize(QtCore.QSize(16777215, 25)) + font = QtGui.QFont() + font.setPointSize(15) + self.lineEdit.setFont(font) + self.lineEdit.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) + self.lineEdit.setAutoFillBackground(False) + self.lineEdit.setStyleSheet("background:transparent;border-width:0;border-style:outset") + self.lineEdit.setObjectName("lineEdit") + self.horizontalLayout.addWidget(self.lineEdit) + self.btn_outbut = QtWidgets.QPushButton(Frame) + self.btn_outbut.setGeometry(QtCore.QRect(310, 360, 111, 23)) + self.btn_outbut.setObjectName("btn_outbut") + + self.retranslateUi(Frame) + QtCore.QMetaObject.connectSlotsByName(Frame) + + def retranslateUi(self, Frame): + _translate = QtCore.QCoreApplication.translate + Frame.setWindowTitle(_translate("Frame", "Frame")) + self.l_remark.setText(_translate("Frame", "曹雨萱")) + self.l_nickname.setText(_translate("Frame", "昵称:997")) + self.l_username.setText(_translate("Frame", "账号:TextLabel")) + self.label.setText(_translate("Frame", "备注名")) + self.lineEdit.setText(_translate("Frame", "曹雨萱")) + self.btn_outbut.setText(_translate("Frame", "导出聊天记录")) diff --git a/app/Ui/contact/userinfo/userinfoUi.ui b/app/Ui/contact/userinfo/userinfoUi.ui new file mode 100644 index 0000000..2b3efab --- /dev/null +++ b/app/Ui/contact/userinfo/userinfoUi.ui @@ -0,0 +1,173 @@ + + + Frame + + + + 0 + 0 + 800 + 720 + + + + IBeamCursor + + + true + + + true + + + Frame + + + + + 210 + 100 + 429 + 82 + + + + + + + + 80 + 80 + + + + + 80 + 80 + + + + + + + ../../../a_img/be0fa6c0c4707fb5f7b37b660de826d3.jpg + + + true + + + + + + + + 15 + + + + 曹雨萱 + + + + + + + 昵称:997 + + + + + + + 账号:TextLabel + + + + + + + + + 210 + 210 + 429 + 71 + + + + + + + + 80 + 0 + + + + + 80 + 16777215 + + + + + 15 + + + + 备注名 + + + + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + + 15 + + + + ArrowCursor + + + false + + + background:transparent;border-width:0;border-style:outset + + + 曹雨萱 + + + + + + + + + 310 + 360 + 111 + 23 + + + + 导出聊天记录 + + + + + +