Python基于PyQt6的聊天软件
QtChat是基于PyQt6开发的一款功能丰富的聊天软件,支持个人/群聊红包(拼手气红包、普通红包、口令红包)、闪照(1秒自动销毁)、表情包、文件传输等特色功能。软件采用透明化UI设计,支持自定义背景(含GIF)、贵族标识(付费)、气泡样式等个性化设置。后端提供管理员系统(密码000000)进行用户管理,包含拼手气红包分配算法、闪照查看窗口等核心代码实现。需要同时下载客户端和服务器端才能运行,项目
我在python中使用PyQt6制作一款聊天软件,因为采用PyQt6库开发,所以将这款聊天软件命名为QtChat。
下载教程
QtChat功能丰富,不仅包含基本的聊天功能,而已添加了额外的功能来增加趣味性,使得这款聊天软件不仅仅因为聊天而聊天。QtChat可为个人发送红包,也可以在群聊中发送红包,群聊红包分三大类,分别是:拼手气红包、普通红包和口令红包,根据字面意思都能知道每个红包的区别。当然,最好玩的那应该是拼手气红包,大家难道不是都喜欢抢红包吗?如果你在微信没有体验到抢红包的乐趣,那就在这里体验体验吧,看看你的运气好不好。
不仅如此你还可以再QtChat中装扮自己,包括对气泡的更换,昵称样式和聊天字体等。当然这是要花钱的。你还可以开通贵族,贵族有专属的标识,并且还有专属的样式。
功能方面说了那么多,来看看界面吧
QtChat的界面采用PyQt6设计,PyQt6可以实现多种样式,有专门的QSS样式表,所以在界面的美观上比tkinter要好看得多。不仅如此,PyQt6还有许多tkinter没有的功能,一些在tkinter需要大量代码且难以实现的功能使用PyQt6就能轻松实现。
说了这么多,来看看效果吧
首先是连接服务器,这是必不可少的

其次是登录/注册界面


上面这界面看着可能很普通,但是下面就要进入到我们的聊天窗口

上面就是整个QtChat的聊天窗口,整个聊天窗口的控件采用透明的方式显示,用户可以根据自身喜爱来更换背景图片,背景图片可以是GIF动图哦。其实默认背景就很漂亮了。
随机点击一位用户,进入聊天界面,然后发送一条消息

可以看到我们输入框的上方有许多功能

发送图片、视频

可以单击查看图片和播放视频的哦
发送文件

发送闪照,会模糊显示,查看闪照的时间只有1秒


发送表情

发送动画表情


接下来就是发送红包了



还有更多功能


更换头像

群聊也可以修改哦

更换昵称











隐藏发送

鼠标悬浮在消息上可以显示消息内容,隐藏的消息不会被保存,包括闪照

置顶

最小化时有弹窗显示

未读提醒

接下来是个性化

贵族专属LOGO

贵族气泡

贵族昵称

贵族底牌样式


购买多种气泡


禁言


邀请用户

踢人

再邀回来

放大阅读

修改字体





改背景

无背景,不好看不建议

备注

上面就是QtChat的界面,怎么样,是不是很美观
那么零钱怎么获得呢?
零钱由管理员打款获得或者他人红包获得,仅此两个方式
进入后台,密码:000000


可对每位用户进行操作,包括的功能:

打款

管理员密码:000000




踢下线

也可以拒绝部分主机的连接

下面拼手气红包的分配算法,可以调整参数调整分配清空
def distribute_red_envelopes(total_amount, num_people, volatility):
"""红包分配机制关键算法"""
if num_people <= 0 or total_amount <= 0 or not (0 <= volatility <= 1):
raise ValueError("Invalid input parameters")
total_amount_in_cents = int(total_amount * 100)
# 计算每个人的基础金额
base_amount = total_amount_in_cents // num_people
remaining_amount = total_amount_in_cents % num_people
# 初始化每个人的金额
amounts = [base_amount] * num_people
# 将剩余金额均匀分配到随机的几个人
for _ in range(remaining_amount):
i = random.randint(0, num_people - 1)
amounts[i] += 1
# 通过波动范围调整每个人的金额
adjusted_amounts = []
for amt in amounts:
min_amount = int(amt * (1 - volatility))
max_amount = int(amt * (1 + volatility))
# 确保 min_amount 不大于 max_amount
if min_amount > max_amount:
min_amount, max_amount = max_amount, min_amount
# 计算分配金额
# 限制 max_amount 确保总金额不超出
max_amount = min(max_amount, total_amount_in_cents - sum(adjusted_amounts) + amt)
if min_amount <= max_amount:
adjusted_amounts.append(random.randint(min_amount, max_amount))
else:
adjusted_amounts.append(amt) # 如果范围无效,则使用基础金额
# 确保总金额正确
amounts_total = sum(adjusted_amounts)
if amounts_total != total_amount_in_cents:
difference = total_amount_in_cents - amounts_total
adjusted_amounts[-1] += difference
# 转换回货币单位(美元或其他货币)
final_amounts = [amt / 100 for amt in adjusted_amounts]
return final_amounts
这是拼手气红包的分配算法,可以调整参数调整分配清空
闪照查看窗口
class FlashPhotoViewer(QMainWindow):
"""闪照查看"""
def __init__(self, image_path, display_time=3000):
super().__init__()
self.setWindowTitle("闪照查看")
self.setGeometry(100, 100, 800, 600)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
central_widget.setLayout(layout)
self.image_label = QLabel()
layout.addWidget(self.image_label)
self.pixmap = QPixmap(image_path)
self.update_image()
self.image_label.setSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored)
self.image_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.timer = QTimer(self)
self.timer.timeout.connect(self.close)
self.timer.setSingleShot(True)
self.timer.start(display_time)
def resizeEvent(self, event):
super().resizeEvent(event)
self.update_image()
def update_image(self):
if self.pixmap:
scaled_pixmap = self.pixmap.scaled(self.size(), Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)
self.image_label.setPixmap(scaled_pixmap)
桌面气泡弹窗
class Notification(QWidget):
"""桌面通知类"""
def __init__(self, title, message):
super().__init__()
self.title = title
self.message = message
self.max_message_length = 50 # 设置最大消息长度
self.initUI()
def initUI(self):
self.setGeometry(10, 10, 300, 100)
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint | Qt.WindowType.Tool)
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
layout = QVBoxLayout()
self.titleLabel = QLabel(self.title)
self.messageLabel = QLabel(self.format_message(self.message))
font = self.titleLabel.font()
font.setPointSize(12)
font.setBold(True)
self.titleLabel.setFont(font)
self.messageLabel.setWordWrap(True)
layout.addWidget(self.titleLabel)
layout.addWidget(self.messageLabel)
self.setLayout(layout)
def format_message(self, message):
if len(message) > self.max_message_length:
return message[:self.max_message_length] + "..." # 超过长度则加上省略号
else:
return message
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
painter.setBrush(QBrush(QColor(255, 255, 255, 200)))
painter.setPen(Qt.PenStyle.NoPen)
painter.drawRoundedRect(self.rect(), 10, 10)
def showEvent(self, event):
self.animateIn()
self.startTimer()
def animateIn(self):
self.animation = QPropertyAnimation(self, b"geometry")
self.animation.setDuration(500)
self.animation.setStartValue(QRect(self.x(), self.y() - self.height(), self.width(), self.height()))
self.animation.setEndValue(QRect(self.x(), self.y(), self.width(), self.height()))
self.animation.setEasingCurve(QEasingCurve.Type.OutCubic)
self.animation.start()
def startTimer(self):
self.timer = QTimer(self)
self.timer.setSingleShot(True) # 只触发一次
self.timer.timeout.connect(self.closeWithAnimation)
self.timer.start(3000) # 3000 毫秒 = 3 秒钟
def closeWithAnimation(self):
self.animation = QPropertyAnimation(self, b"windowOpacity")
self.animation.setDuration(500)
self.animation.setStartValue(1.0)
self.animation.setEndValue(0.0)
self.animation.finished.connect(self.close) # 动画结束后关闭窗口
self.animation.start()
下载教程
QtChat我已经打包成应用程序。文件会有点大
详看:计算机技术课程
https://blog.csdn.net/2301_76542477/article/details/149032632?spm=1011.2415.3001.5331
搜索关键字:QtChat
下载即可,记得需要下载服务器和客户端哦。
别只下个客户端,不行的。两个都要下载,先启动服务器再运行客户端即可。
更多推荐



所有评论(0)