python3+PyQt5自定义视图详解

pyqt提供的几个视图类都可以较好工作,包括QLisView,QTableView和QTreeView。但是对于一些难以用现有的方式来呈现数据,这时,可以创建我们自己的视图子类并将其用做模型数据的可视化来解决这一问题。本文通过Python3+pyqt5实现了python
Qt GUI 快速编程的16章的例子。


    #!/usr/bin/env python3
    
    import gzip
    import os
    import platform
    import sys
    from PyQt5.QtCore import (QAbstractTableModel, QDateTime, QModelIndex,
        QSize, QTimer, QVariant, Qt,pyqtSignal)
    from PyQt5.QtGui import ( QColor, QCursor, QFont,
        QFontDatabase, QFontMetrics, QPainter, QPalette, QPixmap)
    from PyQt5.QtWidgets import QApplication,QDialog,QHBoxLayout, QLabel, QMessageBox,QScrollArea, QSplitter, QTableView,QWidget
    
    
    (TIMESTAMP, TEMPERATURE, INLETFLOW, TURBIDITY, CONDUCTIVITY,
     COAGULATION, RAWPH, FLOCCULATEDPH) = range(8)
    
    TIMESTAMPFORMAT = "yyyy-MM-dd hh:mm"
    
    
    class WaterQualityModel(QAbstractTableModel):
    
      def __init__(self, filename):
        super(WaterQualityModel, self).__init__()
        self.filename = filename
        self.results = []
    
    
      def load(self):
        self.beginResetModel()
        exception = None
        fh = None
        try:
          if not self.filename:
            raise IOError("no filename specified for loading")
          self.results = []
          line_data = gzip.open(self.filename).read()
          for line in line_data.decode("utf8").splitlines():
            parts = line.rstrip().split(",")
            date = QDateTime.fromString(parts[0] + ":00",
                          Qt.ISODate)
    
            result = [date]
            for part in parts[1:]:
              result.append(float(part))
            self.results.append(result)
    
        except (IOError, ValueError) as e:
          exception = e
        finally:
          if fh is not None:
            fh.close()
          self.endResetModel()
          if exception is not None:
            raise exception
    
    
      def data(self, index, role=Qt.DisplayRole):
        if (not index.isValid() or
          not (0 <= index.row() < len(self.results))):
          return QVariant()
        column = index.column()
        result = self.results[index.row()]
        if role == Qt.DisplayRole:
          item = result[column]
          if column == TIMESTAMP:
            #item = item.toString(TIMESTAMPFORMAT)
            item=item
          else:
            #item = QString("%1").arg(item, 0, "f", 2)
            item = "{0:.2f}".format(item)
          return item
        elif role == Qt.TextAlignmentRole:
          if column != TIMESTAMP:
            return QVariant(int(Qt.AlignRight|Qt.AlignVCenter))
          return QVariant(int(Qt.AlignLeft|Qt.AlignVCenter))
        elif role == Qt.TextColorRole and column == INLETFLOW:
          if result[column] < 0:
            return QVariant(QColor(Qt.red))
        elif (role == Qt.TextColorRole and
           column 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值