PyQt 高级部分学习 - 第一篇

自定义组件和信号槽机制

在这一篇中,我们将探讨如何在 PyQt 中创建自定义组件和使用高级的信号槽机制。

自定义组件

自定义组件允许你创建具有特定功能和外观的新组件。下面是一个自定义按钮组件的示例:

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

class MyCustomButton(QPushButton):
    def __init__(self, text):
        super().__init__(text)
        self.setFixedSize(100, 50)

    def mousePressEvent(self, event):
        print("Custom button clicked!")

app = QApplication([])
window = QWidget()
layout = QVBoxLayout()

button = MyCustomButton("Click Me")
layout.addWidget(button)

window.setLayout(layout)
window.show()
app.exec_()

高级信号槽机制

PyQt 的信号槽机制不仅限于简单的点击事件,还可以传递参数和使用自定义信号。

python 复制代码
from PyQt5.QtCore import pyqtSignal, QObject

class MySignal(QObject):
    my_custom_signal = pyqtSignal(str)

    def run(self):
        self.my_custom_signal.emit("Hello, World!")

def my_slot(message):
    print("Received:", message)

signal_instance = MySignal()
signal_instance.my_custom_signal.connect(my_slot)
signal_instance.run()

Model-View-Controller (MVC) 模式

在 PyQt 中,你可以使用 MVC 模式来组织代码和分离关注点。

python 复制代码
# Model
class MyModel:
    def get_data(self):
        return ["Item 1", "Item 2", "Item 3"]

# View
class MyView(QWidget):
    def __init__(self, model):
        super().__init__()
        self.model = model
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()
        data = self.model.get_data()
        for item in data:
            layout.addWidget(QPushButton(item))
        self.setLayout(layout)

# Controller
class MyController:
    def __init__(self):
        self.model = MyModel()
        self.view = MyView(self.model)
        self.view.show()

app = QApplication([])
controller = MyController()
app.exec_()

总结

在这篇文章中,我们探讨了如何在 PyQt 中创建自定义组件,使用高级的信号槽机制,以及如何使用 MVC 模式来组织代码。这些高级特性将有助于你创建更加复杂和可维护的 PyQt 应用程序。

相关推荐
SomeB1oody35 分钟前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
Profile排查笔记1 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户938515635072 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
爱学习的小邓同学2 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
小灰灰搞电子3 小时前
Rust+Slint 实现的“DNA双螺旋”加载动画源码分享
后端·rust·slint·加载动画
面向Google编程3 小时前
向量库不再囤数据:Milvus 3.0 零拷贝直读数据湖
后端
IT_陈寒5 小时前
Redis内存警告竟是因为这个不起眼的配置项
前端·人工智能·后端
Python私教5 小时前
AI 漫剧角色一进分镜就变脸?把提示词升级成“角色 ID + 镜头合同”
后端
Python私教5 小时前
一次生成 20 个角色却全都撞脸:我用“角色合同”重做了批量生成流程
后端
用户594404103566 小时前
Go 语言高性能 Web 服务开发:基于 Gin + GORM + Redis 构建 RESTful API
后端