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 的各种高级功能。

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

相关推荐
Amagi.6 分钟前
Spring中Bean的作用域
java·后端·spring
2402_8575893629 分钟前
Spring Boot新闻推荐系统设计与实现
java·spring boot·后端
J老熊37 分钟前
Spring Cloud Netflix Eureka 注册中心讲解和案例示范
java·后端·spring·spring cloud·面试·eureka·系统架构
Benaso41 分钟前
Rust 快速入门(一)
开发语言·后端·rust
sco528241 分钟前
SpringBoot 集成 Ehcache 实现本地缓存
java·spring boot·后端
原机小子1 小时前
在线教育的未来:SpringBoot技术实现
java·spring boot·后端
吾日三省吾码1 小时前
详解JVM类加载机制
后端
努力的布布2 小时前
SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器
java·后端·spring
PacosonSWJTU2 小时前
spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)
java·后端·springmvc
记得开心一点嘛2 小时前
在Java项目中如何使用Scala实现尾递归优化来解决爆栈问题
开发语言·后端·scala