python3+PyQt5 使用自定义模型保存数据并通过不同视图形式展示数据

本文通过将创建自定义模型保存船只数据,并会用两个不同的表格视图形式来显示同样的模型。
实现自定义模型,继承QAbstractTableModel,具体参照QT库。

/home/yrd/eric_workspace/chap14/ships_model/ships.py

#!/usr/bin/env python3

import platform
from PyQt5.QtCore import (QAbstractTableModel, QDataStream, QFile,
        QIODevice, QModelIndex,QVariant, Qt,pyqtSignal)
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QApplication


NAME, OWNER, COUNTRY, DESCRIPTION, TEU = range(5)

MAGIC_NUMBER = 0x570C4
FILE_VERSION = 1


class Ship(object):

    def __init__(self, name, owner, country, teu=0, description=""):
        self.name = name
        self.owner = owner
        self.country = country
        self.teu = teu
        self.description = description


    def __hash__(self):
        return super(Ship, self).__hash__()


    def __lt__(self, other):
        return bool(self.name.lower()<other.name.lower())


    def __eq__(self, other):
        return bool(self.name.lower()==other.name.lower())



class ShipTableModel(QAbstractTableModel):
    dataChanged = pyqtSignal(QModelIndex,QModelIndex)

    def __init__(self, filename=""):
        super(ShipTableModel, self).__init__()
        self.filename = filename
        self.dirty = False
        self.ships = []
        self.owners = set()
        self.countries = set()


    def sortByName(self):
        self.beginResetModel()
        self.ships = sorted(self.ships)
        self.endResetModel()


    def sortByCountryOwner(self):
        self.beginResetModel()
        self.ships = sorted(self.ships,
                            key=lambda x: (x.country, x.owner, x.name))
        self.endResetModel()



    def flags(self, index):
        if not index.isValid():
            return Qt.ItemIsEnabled
        return Qt.ItemFlags(
                QAbstractTableModel.flags(self, index)|
                Qt.ItemIsEditable)


    def data(self, index, role=Qt.DisplayRole):
        if (not index.isValid() or
            not (0 <= index.row() < len(self.ships))):
            return QVariant()
        ship = self.ships[index.row()]
        column = index.column()
        if role == Qt.DisplayRole:
            if column == NAME:
                return ship.name
            elif column == OWNER:
                return ship.owner
            elif column == COUNTRY:
                return ship.country
            elif column == DESCRIPTION:
                return ship.description
            elif column == TEU:
                return ship.teu
        elif role == Qt.TextAlignmentRole:
            if column == TEU:
                return QVariant(int(Qt.AlignRight|Qt.AlignVCenter))
            return QVariant(int(Qt.AlignLeft|Qt.AlignVCenter))
        elif role == Qt.TextColorRole and column == TEU:
            if ship.teu < 80000:
                return QVariant(QColor(Qt.black))
            elif ship.teu < 100000:
                return QVariant(QColor(Qt.darkBlue))
            elif ship.teu < 120000:
                return QVariant(QColor(Qt.blue))
            else:
                return QVariant(QColor(Qt.red))
        elif role == Qt.BackgroundColorRole:
            if ship.country in ("Bahamas", "Cyprus", "Denmark",
                    "France", "Germany", "Greece"):
                return QVariant(QColor(250, 230, 250))
            elif ship.country in ("Hong Kong", "Japan", "Taiwan"):
                return QVariant(QColor(250, 250, 230))
            elif ship.country in ("Marshall Islands",):
                return QVariant(QColor(230, 250, 250))
            else:
                return QVariant(QColor(210, 230, 230))
        return QVariant()


    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if role == Qt.TextAlignmentRole:
            if orientation == Qt.Horizontal:
                return QVariant(int(Qt.AlignLeft|Qt.AlignVCenter))
            return QVariant(int(Qt.AlignRight|Qt.AlignVCenter))
        if role != Qt.DisplayRole:
            return QVariant()
        if orientation == Qt.Horizontal:
            if section == NAME:
                return QVariant("Name")
            elif section == OWNER:
                return QVariant("Owner")
            elif section == COUNTRY:
                return QVariant("Country")
            elif section == DESCRIPTION:
                return QVariant("Description")
            elif section == TEU:
                return QVariant("TEU")
        return QVariant(int(section + 1))


    def rowCount(self, index=QModelIndex()):
        return len(self.ships)


    def columnCount(self, index=QModelIndex()):
        return 5


    def setData(self, index, value, role=Qt.EditRole):
        if index.isValid() and 0 <= index.row() < len(self.ships):
            #self.beginResetModel()
            ship = self.ships[index.row()]
            column = index.column()
            if column == NAME:
                ship.name = str(value)
            elif column == OWNER:
                ship.owner = str(value)
            elif column == COUNTRY:
                ship.country = str(value)
            elif column == DESCRIPTION:
                ship.description = str(value)
            elif column == TEU:
                if str(value).isdecimal():
                    ship.teu=int(value)
            self.dirty = True
            self.dataChanged[QModelIndex,QModelIndex].emit(index,index)
            #self.endResetModel()
            return True
        return False


    def insertRows(self, position, rows=1, index=QModelIndex
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python3是一种编程语言,它提供了很多库和框架可以用于各种应用开发。PyQt5Python3的一个GUI(图形用户界面)库,它允许我们创建各种图形界面应用程序。PyCharm是一个Python集成开发环境(IDE),它提供了丰富的功能和工具,可以方便地进行Python编程和应用程序开发。 在Python3中,我们可以使用PyQt5库来访问和控制摄像头。通过使用PyQt5的QCamera和QCameraViewfinder类,我们可以访问计算机上已连接的摄像头设备,并在应用程序中显示摄像头视频流。这样我们就能够在应用程序中捕捉摄像头的图像,并进行进一步的处理和分析。 PyCharm是一个非常流行的Python开发工具,它提供了许多有用的功能来帮助我们编写、调试和测试Python代码。在PyCharm中,我们可以直接编写Python代码,并使用其强大的代码编辑器和自动补全功能来提高编码效率。同时,PyCharm还提供了集成的调试器,可以方便地调试和跟踪代码的执行过程。 因此,如果我们想在Python3使用PyQt5库来访问和控制摄像头,并且希望使用一个强大的开发工具来编写和调试代码,我们可以选择使用PyCharm作为我们的开发环境。PyCharm提供了直观的界面和丰富的功能,可以让我们更轻松地编写和调试基于PyQt5的摄像头应用程序。 ### 回答2: Python3是一种高级编程语言,PyQt5是用于创建图形界面应用程序的Python库,PyCharm是一种集成开发环境(IDE)。摄像头通常是指用于捕捉图像或视频的设备。 在Python使用摄像头,可以使用OpenCV库来实现。OpenCV是一个开源计算机视觉库,可用于处理图像和视频。 要在PyQt5使用摄像头,可以通过使用QCamera类来获取和控制摄像头。您可以将QCamera对象与QCameraViewfinder或QGraphicsView一起使用,以便在应用程序中显示摄像头捕捉的图像。 对于IDE,PyCharm是一种流行的Python开发环境,具有代码编辑器、调试器、版本控制等功能。PyCharm提供了丰富的功能和工具,使Python开发更加高效和便捷。 要在PyCharm中使用Python3PyQt5以及摄像头,您可以首先安装Python3PyQt5库。然后,您可以设置项目,并使用PyCharm提供的编辑器编写代码。在代码中,您可以导入所需的库和模块,以及使用适当的代码来处理摄像头和图像。 总而言之,您可以使用Python3编写具有PyQt5界面的应用程序,并在PyCharm中进行开发和调试。通过使用OpenCV库,您还可以使用摄像头捕捉图像和视频。 ### 回答3: Python3是一种高级编程语言,广泛应用于各个领域的软件开发和数据分析。PyQt5是一个Python模块,用于创建交互式和可视化的桌面应用程序。PyCharm是一种以Python为主要语言的集成开发环境(IDE),它提供了许多方便的工具和功能来帮助开发者更高效地编写和调试代码。 在Python3中,我们可以使用PyQt5来编写应用程序,包括调用摄像头进行图像采集和处理。通过调用PyQt5中的相机模块,我们可以访问计算机上的摄像头设备,并获取实时的图像数据使用这些图像数据,我们可以进行各种图像处理操作,如图像增强、图像过滤、目标跟踪等。 为了更好地开发和调试Python应用程序,我们可以使用PyCharm作为开发工具。PyCharm提供了代码编辑器、调试器、版本控制集成等功能,可以提高开发效率和代码质量。在PyCharm中,我们可以轻松设置Python解释器,并导入所需的库和模块,以便使用PyQt5进行摄像头编程。 总结来说,Python3PyQt5和PyCharm可以一起使用来实现摄像头相关的应用程序。Python3提供了强大的编程能力,PyQt5提供了访问和处理摄像头图像的功能,而PyCharm提供了开发工具和环境,使开发者可以更轻松地进行开发和调试工作。通过这些工具和技术,我们可以实现各种摄像头应用,如视频监控系统、人脸识别系统等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值