前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PySide6 GUI 编程(40):MVC 设计原则下QListView的使用

PySide6 GUI 编程(40):MVC 设计原则下QListView的使用

原创
作者头像
bowenerchen
发布于 2024-09-01 13:28:36
发布于 2024-09-01 13:28:36
41018
代码可运行
举报
文章被收录于专栏:编码视界编码视界
运行总次数:8
代码可运行

基于MVC原则构造一个TODO List交互工具

我们的总体目标是期望实现一个简单的待办事项列表应用程序。

应用程序允许用户添加、删除和标记待办事项为已完成。

代码应该遵循MVC(模型-视图-控制器)设计原则,将数据模型、视图和控制器分离,以便于维护和扩展。

功能概述

  • 用户可以通过输入框输入待办事项。
  • 点击“添加”按钮将待办事项添加到列表中。
  • 用户可以选择列表中的待办事项,然后点击“删除”按钮删除选定的待办事项。
  • 用户可以选择列表中的待办事项,然后点击“完成”按钮将选定的待办事项标记为已完成。
  • 完成的待办事项会显示一个图标并变为不可编辑状态。

代码设计思路和原则

  • 使用MVC设计原则,将数据模型、视图和控制器分离。这使得代码更容易维护和扩展。
  • 创建一个自定义的TodoModel类,继承自QStandardItemModel。TodoModel中定义了添加、删除和完成待办事项的方法,这些方法封装了对数据模型的操作。这使得数据模型的逻辑与控制器和视图分离,便于维护。
  • 创建一个自定义的TodoView类,继承自QListView。TodoView接受一个TodoModel实例作为参数,并将其设置为视图的模型。这使得视图可以显示和操作数据模型中的数据。
  • MyMainWindow类作为控制器,负责处理用户界面事件(如按钮点击事件)。当用户执行操作(如添加、删除或完成待办事项)时,MyMainWindow会调用TodoModel的相应方法来更新数据。这使得控制器的逻辑与数据模型和视图分离,便于维护。

示例代码

代码语言:python
代码运行次数:8
运行
AI代码解释
复制
from __future__ import annotations

import sys
from datetime import datetime

from PySide6.QtGui import QIcon, QStandardItem, QStandardItemModel
from PySide6.QtWidgets import QAbstractItemView, QApplication, QHBoxLayout, QLineEdit, QListView, QMainWindow, QPushButton, \
    QVBoxLayout, QWidget


def get_time_str() -> str:
    return datetime.now().isoformat()


class TodoModel(QStandardItemModel):
    def add_item(self, text: str):
        item = QStandardItem('{} at {}'.format(text, get_time_str()))
        item.setEditable(False)
        self.appendRow(item)

    def remove_item(self, index):
        if index.isValid():
            self.removeRow(index.row())

    def complete_item(self, index):
        if index.isValid():
            item = self.itemFromIndex(index)
            item.setIcon(QIcon('os_ubuntu_icon.png'))
            item.setEnabled(False)


class TodoView(QListView):
    def __init__(self, model: TodoModel):
        super().__init__()
        self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
        self.setObjectName('TODO列表视图效果展示')
        self.setModel(model)


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('ToDo List View Demo')

        self.model = TodoModel()
        self.view = TodoView(self.model)

        self._setup_ui()

    def _setup_ui(self):
        # 横向布局
        self.h_layout = QHBoxLayout()
        self.delete_button = QPushButton('删除')
        self.delete_button.clicked.connect(self.delete_button_clicked)
        self.complete_button = QPushButton('完成')
        self.complete_button.clicked.connect(self.complete_button_clicked)
        self.h_layout.addWidget(self.delete_button)
        self.h_layout.addWidget(self.complete_button)
        self.line_edit = QLineEdit()
        self.line_edit.setPlaceholderText('输入待办事项')
        self.add_button = QPushButton('添加')
        self.add_button.clicked.connect(self.add_button_clicked)

        # 纵向布局
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.view)
        self.v_layout.addLayout(self.h_layout)
        self.v_layout.addWidget(self.line_edit)
        self.v_layout.addWidget(self.add_button)

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

    def add_button_clicked(self, _: bool):
        self.model.add_item(self.line_edit.text().strip())
        self.line_edit.clear()

    def delete_button_clicked(self):
        self.model.remove_item(self.view.currentIndex())

    def complete_button_clicked(self):
        self.model.complete_item(self.view.currentIndex())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    sys.exit(app.exec())

静态效果

静态效果
静态效果

动态效果

创建、删除与已完成
创建、删除与已完成

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
优秀
优秀
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
表格与树解决的问题是如何在一个控件中有规律地呈现更多的数据。PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类,另一种是树形结构的控件类。
不脱发的程序猿
2021/11/02
4.2K0
PyQt5 高级界面控制(表格、树、tab、dock、scrollbar、多文档界面)
learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Docs/PyQt5
Michael阿明
2022/05/30
7.2K0
PyQt5 高级界面控制(表格、树、tab、dock、scrollbar、多文档界面)
PyQt+SQLite构建一个简单的账号管理GUI程序
相信有很多的测试同学,在日常的工作中都会需要去写一些辅助测试的小工具或者脚本,我们除了保证工具的可用性之外,有时还需要做一些图形界面上的开发以便在公司或者小组内推广。本文旨在以实战的形式,完成一个简单的账号管理GUI程序,实现完整的增、删、改、查功能项,带大家了解如何系统的开发一个账号管理GUI程序。
测试邦
2019/10/21
4K0
PyQt+SQLite构建一个简单的账号管理GUI程序
PySide6 GUI 编程(38):信号拦截与 lambda 槽函数
在之前的文章:PySide6 GUI 编程(3):信号槽机制中已经探讨过关于自定义信号的场景。在一些更追求灵活性的场景下,我们需要自定义信号,以此触发更多自定义的行为。
bowenerchen
2024/08/31
9970
PySide6 GUI 编程(38):信号拦截与 lambda 槽函数
PySide6 GUI 编程(31):多个 QWidget 窗口展示
进程在刚启动时会初始化出两个窗口,这可以证明 init_new_window() 返回的对象是可以正常展示的
bowenerchen
2024/08/21
6233
PySide6 GUI 编程(31):多个 QWidget 窗口展示
PySide6 GUI 编程(2):窗口设置与基础控件
上述代码中,class MyMainWindow(QMainWindow):定义了一个名为 MyMainWindow 的类,它继承自 QMainWindow 类。QMainWindow 是Qt框架中用于创建和管理主窗口的一个类,这意味着 MyMainWindow 类将拥有 QMainWindow 的所有功能和属性。
bowenerchen
2024/05/19
8591
PySide6 GUI 编程(2):窗口设置与基础控件
PySide6 GUI 编程(41):QTableView 与 QTreeView
bowenerchen
2024/09/01
5542
PySide6 GUI 编程(41):QTableView 与 QTreeView
PySide6 GUI 编程(32):QMouseEvent 鼠标事件
bowenerchen
2024/08/23
4861
PySide6 GUI 编程(32):QMouseEvent 鼠标事件
PySide6 GUI 编程(46): 基于QThread构造常驻后台的线程
在 PySide6 中,QRunnable 和 QThread 都可以用来在后台执行任务,但它们的使用场景和设计目的有所不同。
bowenerchen
2024/09/17
5240
PySide6 GUI 编程(46): 基于QThread构造常驻后台的线程
PySide6 GUI 编程(27):QFileDialog的简单使用
bowenerchen
2024/08/21
4081
PySide6 GUI 编程(27):QFileDialog的简单使用
PySide6 GUI 编程(37):QStyle.StandardPixmap 系统内置图标
bowenerchen
2024/08/26
4381
PySide6 GUI 编程(37):QStyle.StandardPixmap 系统内置图标
PySide6 GUI 编程(29):QWizard 的简单示例
bowenerchen
2024/08/21
2403
PySide6 GUI 编程(29):QWizard 的简单示例
PySide6 GUI 编程(24):QDialog以及QDialogButtonBox
QDialog 自身运行时会触发一个事件循环, 这个事件循环与 QApplication 的事件循环并没有显著的从属关系,可以认为它们是独立的。
bowenerchen
2024/08/08
5562
PySide6 GUI 编程(24):QDialog以及QDialogButtonBox
一个PyQt5示例(密码记忆箱)
新建、修改、和删除分别对应工具条上的三个按钮。程序现将账号密码等信息显示在表格里(QTableWidget),确认后立即永久保存/更新到本地数据库,或从本地数据库删除。下次打开就会从本地数据库加载到表格。
用户6021899
2019/08/14
1.5K0
PySide6 GUI 编程(30):其他常见对话框
bowenerchen
2024/08/21
2292
PySide6 GUI 编程(30):其他常见对话框
PySide6 GUI 编程(18):QGridLayout的简单用法
bowenerchen
2024/07/29
3630
PySide6 GUI 编程(18):QGridLayout的简单用法
PySide6 GUI 编程(25):QMessageBox的简单使用
bowenerchen
2024/08/12
4482
PySide6 GUI 编程(25):QMessageBox的简单使用
PySide6 GUI 编程(28):QProgressDialog进度条
当进度值累加到最大值或超过最大值时,QProgressDialog会将进度值重置为-1
bowenerchen
2024/08/21
4972
PySide6 GUI 编程(28):QProgressDialog进度条
PySide6 GUI 编程(16):QTimer 的简单用法
bowenerchen
2024/07/25
4770
PySide6 GUI 编程(16):QTimer 的简单用法
【QT】QT模型/视图
MVC(Model-View-Controller)包括了3个组件:模型(model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;控制(Controller)定义了用户界面对用户输入的反应方式。
半生瓜的blog
2023/05/13
3.2K0
【QT】QT模型/视图
推荐阅读
相关推荐
Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验