综合示例:简单的聊天应用
在这一篇中,我们将结合之前所学的所有内容,创建一个简单的聊天应用。这个应用将包括自定义组件、高级信号槽机制、MVC 模式以及网络编程。
应用结构
- 主窗口:包含一个文本编辑器用于显示聊天记录,一个文本框用于输入消息,和一个发送按钮。
- 网络:使用
QTcpSocket
和QTcpServer
进行通信。
代码实现
主窗口
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 的各种高级功能。
请继续关注下一篇文章,我们将探讨更多高级主题!