PyQt 高级部分学习 - 第三篇

综合示例:简单的聊天应用

在这一篇中,我们将结合之前所学的所有内容,创建一个简单的聊天应用。这个应用将包括自定义组件、高级信号槽机制、MVC 模式以及网络编程。

应用结构

  • 主窗口:包含一个文本编辑器用于显示聊天记录,一个文本框用于输入消息,和一个发送按钮。
  • 网络:使用 QTcpSocketQTcpServer 进行通信。

代码实现

主窗口

python 复制代码
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QLineEdit, QPushButton, QVBoxLayout, QWidget

class ChatWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.text_edit = QTextEdit()
        self.text_edit.setReadOnly(True)

        self.text_input = QLineEdit()
        self.text_input.setPlaceholderText("Type your message...")

        self.send_button = QPushButton("Send")
        self.send_button.clicked.connect(self.send_message)

        layout = QVBoxLayout()
        layout.addWidget(self.text_edit)
        layout.addWidget(self.text_input)
        layout.addWidget(self.send_button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def send_message(self):
        message = self.text_input.text()
        self.text_edit.append(f"You: {message}")
        self.text_input.clear()

网络部分

这部分与之前的聊天服务器和客户端类似,但是我们会将其集成到 ChatWindow 类中。

python 复制代码
# 在 ChatWindow 类中添加以下代码
from PyQt5.QtNetwork import QTcpServer, QTcpSocket
from PyQt5.QtCore import QDataStream, QIODevice

class ChatWindow(QMainWindow):
    # ...(省略其他代码)

    def setup_server(self):
        self.tcp_server = QTcpServer(self)
        self.tcp_server.listen(port=5000)
        self.tcp_server.newConnection.connect(self.new_connection)

    def new_connection(self):
        self.client_socket = self.tcp_server.nextPendingConnection()
        self.client_socket.readyRead.connect(self.read_message)

    def read_message(self):
        incoming_data = QDataStream(self.client_socket)
        incoming_data.setVersion(QDataStream.Qt_5_0)

        if self.client_socket.bytesAvailable() > 0:
            message = incoming_data.readString()
            self.text_edit.append(f"Client: {message}")

    def send_message(self):
        message = self.text_input.text()
        self.text_edit.append(f"You: {message}")
        self.text_input.clear()

        outgoing_data = QDataStream(self.client_socket)
        outgoing_data.setVersion(QDataStream.Qt_5_0)
        outgoing_data.writeString(message)

运行应用

python 复制代码
app = QApplication([])
window = ChatWindow()
window.setup_server()
window.show()
app.exec_()

这样,我们就完成了一个简单但功能完整的聊天应用。在这个应用中,我们综合运用了 PyQt 的各种高级功能。

请继续关注下一篇文章,我们将探讨更多高级主题!

相关推荐
KeepPush21 分钟前
Python JSON 完全指南:从基础到实战,掌握数据交换核心技能
后端
Cosolar33 分钟前
深度测评 | QoderWork:当 AI 不再只是"聊天搭子",而是真能帮你干活的桌面智能体
人工智能·后端·程序员
前端Hardy34 分钟前
21.8 万周下载!这个 React 表格组件,10 行代码就能跑起来
前端·javascript·后端
用户8356290780511 小时前
使用 Python 在 Word 文档中添加和管理脚注
后端
字节跳动数据库1 小时前
一个请求稳定的一生
后端·程序员
RainCity1 小时前
Java Swing 自定义组件库分享(十一)
java·笔记·后端
掘金一周2 小时前
问卷调查:如果现在收到裁员通知,你手里的现金流能支撑多久? | 沸点周刊6.4
前端·人工智能·后端
JustHappy3 小时前
古法编程秘籍(四):函数究竟是什么?把函数最重要的能力一次讲清楚
前端·后端·面试
_Evan_Yao3 小时前
一文搞懂:Git分支管理与团队协作规范——从GitFlow到GitHub Flow,从rebase到merge,打造高效协作流
java·git·后端·github
得物技术3 小时前
用 LLM Agent 重构告警排查流程|得物技术
java·人工智能·后端