python 泛型_python3+PyQt5泛型委托详解

本文介绍了如何使用Python3和PyQt5创建泛型委托,以减少自定义委托中的重复代码。通过示例代码展示了如何创建和使用RichTextLineEdit和GenericDelegate,它们分别用于富文本编辑和表格视图中的自定义列处理。同时,还提供了一个CarHireLog模型和相关委托类,用于展示如何在GUI中处理租车记录数据。
摘要由CSDN通过智能技术生成

自定义委托可以让我们对视图中出现的数据项的外观和行为进行完全控制。如果有很多模型,可能会希望不是全部的大多数模型能够仅用一个自定义委托,如果不能这么做,那么对于这些自定义委托,将很有可能存在大量重复代码。为了使得维护工作变得轻松,更好的方法为不要为每个模型创建一个自定义委托,而是用一系列的通用组件来共同构成一个委托。本文通过Python3+pyqt5实现了python Qt GUI 快速编程的16章的泛型委托例子。

/home/yrd/eric_workspace/chap16/richtextlineedit.py

#!/usr/bin/env python3

import platform

import sys

import html

from PyQt5.QtCore import QSize, Qt,pyqtSignal

from PyQt5.QtGui import QColor, QFont,QFontMetrics, QIcon, QKeySequence, QPixmap,QTextCharFormat

from PyQt5.QtWidgets import QAction,QApplication,QMenu,QTextEdit

class RichTextLineEdit(QTextEdit):

returnPressed=pyqtSignal()

(Bold, Italic, Underline, StrikeOut, Monospaced, Sans, Serif,

NoSuperOrSubscript, Subscript, Superscript) = range(10)

def __init__(self, parent=None):

super(RichTextLineEdit, self).__init__(parent)

self.monofamily = "courier"

self.sansfamily = "helvetica"

self.seriffamily = "times"

self.setLineWrapMode(QTextEdit.NoWrap)

self.setTabChangesFocus(True)

self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

fm = QFontMetrics(self.font())

h = int(fm.height() * (1.4 if platform.system() == "Windows"

else 1.2))

self.setMinimumHeight(h)

self.setMaximumHeight(int(h * 1.2))

self.setToolTip("Press Ctrl+M for the text effects "

"menu and Ctrl+K for the color menu")

def toggleItalic(self):

self.setFontItalic(not self.fontItalic())

def toggleUnderline(self):

self.setFontUnderline(not self.fontUnderline())

def toggleBold(self):

self.setFontWeight(QFont.Normal

if self.fontWeight() > QFont.Normal else QFont.Bold)

def sizeHint(self):

return QSize(self.document().idealWidth() + 5,

self.maximumHeight())

def minimumSizeHint(self):

fm = QFontMetrics(self.font())

return QSize(fm.width("WWWW"), self.minimumHeight())

def contextMenuEvent(self, event):

self.textEffectMenu()

def keyPressEvent(self, event):

if event.modifiers() & Qt.ControlModifier:

handled = False

if event.key() == Qt.Key_B:

self.toggleBold()

handled = True

elif event.key() == Qt.Key_I:

self.toggleItalic()

handled = True

elif event.key() == Qt.Key_K:

self.colorMenu()

handled = True

elif event.key() == Qt.Key_M:

self.textEffectMenu()

handled = True

elif event.key() == Qt.Key_U:

self.toggleUnderline()

handled = True

if handled:

event.accept()

return

if event.key() in (Qt.Key_Enter, Qt.Key_Return):

self.returnPressed.emit()

event.accept()

else:

QTextEdit.keyPressEvent(self, event)

def colorMenu(self):

pixmap = QPixmap(22, 22)

menu = QMenu("Colour")

for text, color in (

("&Black", Qt.black),

("B&lue", Qt.blue),

("Dark Bl&ue", Qt.darkBlue),

("&Cyan", Qt.cyan),

("Dar&k Cyan", Qt.darkCyan),

("&Green", Qt.green),

("Dark Gr&een", Qt.darkGreen),

("M&agenta", Qt.magenta),

("Dark Mage&nta", Qt.darkMagenta),

("&Red", Qt.red),

("&Dark Red", Qt.darkRed)):

color = QColor(color)

pixmap.fill(color)

action = menu.addAction(QIcon(pixmap), text, self.setColor)

action.setData(color)

self.ensureCursorVisible()

menu.exec_(self.viewport().mapToGlobal(

self.cursorRect().center()))

def setColor(self):

action = self.sender()

if action is not None and isinstance(action, QAction):

color = QColor(action.data())

if color.isValid():

self.setTextColor(color)

def textEffectMenu(self):

format = self.currentCharFormat()

menu = QMenu("Text Effect")

for text, shortcut, data, checked in (

("&Bold", "Ctrl+B", RichTextLineEdit.Bold,

self.fontWeight() > QFont.Normal),

("&Italic", "Ctrl+I", RichTextLineEdit.Italic,

self.fontItalic()),

("Strike &out", None, RichTextLineEdit.StrikeOut,

format.fontStrikeOut()),

("&Underline", "Ctrl+U", RichTextLineEdit.Underline,

self.fontUnderline()),

("&Monospaced", None, RichTextLineEdit.Monospaced,

format.fontFamily() == self.monofamily),

("&Serifed", None, RichTextLineEdit.Serif,

format.fontFamily() == self.seriffamily),

("S&ans Serif", None, RichTextLineEdit.Sans,

format.fontFamily() == self.sansfamily),

("&No super or subscript", None,

RichTextLineEdit.NoSuperOrSubscript,

format.verticalAlignmen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值