欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

python3+PyQt5泛型委托的示例分析-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)python3+PyQt5泛型委托的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供網(wǎng)站制作、成都做網(wǎng)站服務(wù),網(wǎng)站設(shè)計(jì),成都網(wǎng)站托管等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競(jìng)爭(zhēng)對(duì)手中脫穎而出創(chuàng)新互聯(lián)。

自定義委托可以讓我們對(duì)視圖中出現(xiàn)的數(shù)據(jù)項(xiàng)的外觀和行為進(jìn)行完全控制。如果有很多模型,可能會(huì)希望不是全部的大多數(shù)模型能夠僅用一個(gè)自定義委托,如果不能這么做,那么對(duì)于這些自定義委托,將很有可能存在大量重復(fù)代碼。為了使得維護(hù)工作變得輕松,更好的方法為不要為每個(gè)模型創(chuàng)建一個(gè)自定義委托,而是用一系列的通用組件來共同構(gòu)成一個(gè)委托。本文通過Python3+pyqt5實(shí)現(xiàn)了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 <b>Ctrl+M</b> for the text effects "
    "menu and <b>Ctrl+K</b> 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.verticalAlignment() ==
     QTextCharFormat.AlignNormal),
    ("Su&perscript", None, RichTextLineEdit.Superscript,
     format.verticalAlignment() ==
     QTextCharFormat.AlignSuperScript),
    ("Subs&cript", None, RichTextLineEdit.Subscript,
     format.verticalAlignment() ==
     QTextCharFormat.AlignSubScript)):
   action = menu.addAction(text, self.setTextEffect)
   if shortcut is not None:
    action.setShortcut(QKeySequence(shortcut))
   action.setData(data)
   action.setCheckable(True)
   action.setChecked(checked)
  self.ensureCursorVisible()
  menu.exec_(self.viewport().mapToGlobal(
     self.cursorRect().center()))


 def setTextEffect(self):
  action = self.sender()
  if action is not None and isinstance(action, QAction):
   what = action.data()
   if what == RichTextLineEdit.Bold:
    self.toggleBold()
    return
   if what == RichTextLineEdit.Italic:
    self.toggleItalic()
    return
   if what == RichTextLineEdit.Underline:
    self.toggleUnderline()
    return
   format = self.currentCharFormat()
   if what == RichTextLineEdit.Monospaced:
    format.setFontFamily(self.monofamily)
   elif what == RichTextLineEdit.Serif:
    format.setFontFamily(self.seriffamily)
   elif what == RichTextLineEdit.Sans:
    format.setFontFamily(self.sansfamily)
   if what == RichTextLineEdit.StrikeOut:
    format.setFontStrikeOut(not format.fontStrikeOut())
   if what == RichTextLineEdit.NoSuperOrSubscript:
    format.setVerticalAlignment(
      QTextCharFormat.AlignNormal)
   elif what == RichTextLineEdit.Superscript:
    format.setVerticalAlignment(
      QTextCharFormat.AlignSuperScript)
   elif what == RichTextLineEdit.Subscript:
    format.setVerticalAlignment(
      QTextCharFormat.AlignSubScript)
   self.mergeCurrentCharFormat(format)


 def toSimpleHtml(self):
  htmltext = ""
  black = QColor(Qt.black)
  block = self.document().begin()
  while block.isValid():
   iterator = block.begin()
   while iterator != block.end():
    fragment = iterator.fragment()
    if fragment.isValid():
     format = fragment.charFormat()
     family = format.fontFamily()
     color = format.foreground().color()     
     text=html.escape(fragment.text())
     if (format.verticalAlignment() ==
      QTextCharFormat.AlignSubScript):
      text = "<sub>{0}</sub>".format(text)
     elif (format.verticalAlignment() ==
       QTextCharFormat.AlignSuperScript):
      text = "<sup>{0}</sup>".format(text)
     if format.fontUnderline():
      text = "<u>{0}</u>".format(text)
     if format.fontItalic():
      text = "<i>{0}</i>".format(text)
     if format.fontWeight() > QFont.Normal:
      text = "<b>{0}</b>".format(text)
     if format.fontStrikeOut():
      text = "<s>{0}</s>".format(text)
     if color != black or family:
      attribs = ""
      if color != black:
       attribs += ' color="{0}"'.format(color.name())
      if family:
       attribs += ' face="{0}"'.format(family)
      text = "<font{0}>{1}</font>".format(attribs,text)
     htmltext += text
    iterator += 1
   block = block.next()
  return htmltext

if __name__ == "__main__":
 def printout(lineedit):
  print(str(lineedit.toHtml()))
  print(str(lineedit.toPlainText()))
  print(str(lineedit.toSimpleHtml()))    
 app = QApplication(sys.argv)
 lineedit = RichTextLineEdit()
 lineedit.returnPressed.connect(lambda:printout(lineedit))
 lineedit.show()
 lineedit.setWindowTitle("RichTextEdit")
 app.exec_()

/home/yrd/eric_workspace/chap16/genericdelegates.py

#!/usr/bin/env python3

from PyQt5.QtCore import (QDate, QSize, Qt)
from PyQt5.QtWidgets import (QApplication, QDateEdit, QLineEdit,
  QSpinBox, QStyledItemDelegate,QStyle)
from PyQt5.QtGui import QColor,QTextDocument
import richtextlineedit


class GenericDelegate(QStyledItemDelegate):

 def __init__(self, parent=None):
  super(GenericDelegate, self).__init__(parent)
  self.delegates = {}


 def insertColumnDelegate(self, column, delegate):
  delegate.setParent(self)
  self.delegates[column] = delegate


 def removeColumnDelegate(self, column):
  if column in self.delegates:
   del self.delegates[column]


 def paint(self, painter, option, index):
  delegate = self.delegates.get(index.column())
  if delegate is not None:
   delegate.paint(painter, option, index)
  else:
   QStyledItemDelegate.paint(self, painter, option, index)


 def createEditor(self, parent, option, index):
  delegate = self.delegates.get(index.column())
  if delegate is not None:
   return delegate.createEditor(parent, option, index)
  else:
   return QStyledItemDelegate.createEditor(self, parent, option,
             index)


 def setEditorData(self, editor, index):
  delegate = self.delegates.get(index.column())
  if delegate is not None:
   delegate.setEditorData(editor, index)
  else:
   QStyledItemDelegate.setEditorData(self, editor, index)


 def setModelData(self, editor, model, index):
  delegate = self.delegates.get(index.column())
  if delegate is not None:
   delegate.setModelData(editor, model, index)
  else:
   QStyledItemDelegate.setModelData(self, editor, model, index)


class IntegerColumnDelegate(QStyledItemDelegate):

 def __init__(self, minimum=0, maximum=100, parent=None):
  super(IntegerColumnDelegate, self).__init__(parent)
  self.minimum = minimum
  self.maximum = maximum


 def createEditor(self, parent, option, index):
  spinbox = QSpinBox(parent)
  spinbox.setRange(self.minimum, self.maximum)
  spinbox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
  return spinbox


 def setEditorData(self, editor, index):
  value = index.model().data(index, Qt.DisplayRole)
  editor.setValue(value)


 def setModelData(self, editor, model, index):
  editor.interpretText()
  model.setData(index, editor.value())


class DateColumnDelegate(QStyledItemDelegate):

 def __init__(self, minimum=QDate(),
     maximum=QDate.currentDate(),
     format="yyyy-MM-dd", parent=None):
  super(DateColumnDelegate, self).__init__(parent)
  self.minimum = minimum
  self.maximum = maximum
  self.format = format


 def createEditor(self, parent, option, index):
  dateedit = QDateEdit(parent)
  #dateedit=QDateTimeEdit(parent)
  dateedit.setDateRange(self.minimum, self.maximum)
  dateedit.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
  dateedit.setDisplayFormat(self.format)
  dateedit.setCalendarPopup(True)
  return dateedit


 def setEditorData(self, editor, index):
  value = index.model().data(index, Qt.DisplayRole)
  #if value.isNull:
  editor.setDate(value)
  #editor.setDisplayFormat(self.format)

 def setModelData(self, editor, model, index):
  model.setData(index, editor.date())
 def paint(self, painter, option, index):
  text = index.model().data(index, Qt.DisplayRole).toString(self.format)
  palette = QApplication.palette()
  document = QTextDocument()
  document.setDefaultFont(option.font)
  if option.state & QStyle.State_Selected:
   document.setHtml("<font color={0}>{1}</font>".format(palette.highlightedText().color().name(),text))
  else:
   document.setHtml(text)
  painter.save()
  color = (palette.highlight().color()
     if option.state & QStyle.State_Selected
     else QColor(index.model().data(index,
        Qt.BackgroundColorRole)))
  painter.fillRect(option.rect, color)
  painter.translate(option.rect.x(), option.rect.y())
  document.drawContents(painter)
  painter.restore()  


class PlainTextColumnDelegate(QStyledItemDelegate):

 def __init__(self, parent=None):
  super(PlainTextColumnDelegate, self).__init__(parent)


 def createEditor(self, parent, option, index):
  lineedit = QLineEdit(parent)
  return lineedit


 def setEditorData(self, editor, index):
  value = index.model().data(index, Qt.DisplayRole)
  editor.setText(value)


 def setModelData(self, editor, model, index):
  model.setData(index, editor.text())


class RichTextColumnDelegate(QStyledItemDelegate):

 def __init__(self, parent=None):
  super(RichTextColumnDelegate, self).__init__(parent)


 def paint(self, painter, option, index):
  text = index.model().data(index, Qt.DisplayRole)
  palette = QApplication.palette()
  document = QTextDocument()
  document.setDefaultFont(option.font)
  if option.state & QStyle.State_Selected:
   document.setHtml("<font color={0}>{1}</font>".format(palette.highlightedText().color().name(),text))
  else:
   document.setHtml(text)
  painter.save()
  color = (palette.highlight().color()
     if option.state & QStyle.State_Selected
     else QColor(index.model().data(index,
        Qt.BackgroundColorRole)))
  painter.fillRect(option.rect, color)
  painter.translate(option.rect.x(), option.rect.y())
  document.drawContents(painter)
  painter.restore()


 def sizeHint(self, option, index):
  text = index.model().data(index).toString()
  document = QTextDocument()
  document.setDefaultFont(option.font)
  document.setHtml(text)
  return QSize(document.idealWidth() + 5,
      option.fontMetrics.height())


 def createEditor(self, parent, option, index):
  lineedit = richtextlineedit.RichTextLineEdit(parent)
  return lineedit


 def setEditorData(self, editor, index):
  value = index.model().data(index, Qt.DisplayRole)
  editor.setHtml(value)


 def setModelData(self, editor, model, index):
  model.setData(index, editor.toSimpleHtml())

/home/yrd/eric_workspace/chap16/carhirelog.pyw

#!/usr/bin/env python3

import bisect
import os
import platform
import sys
from PyQt5.QtCore import (QAbstractTableModel, QDate, QModelIndex,
  QVariant, Qt,pyqtSignal)
from PyQt5.QtWidgets import (QApplication, QMainWindow,
  QShortcut, QTableView)
from PyQt5.QtGui import QKeySequence
import genericdelegates


(LICENSE, CUSTOMER, HIRED, MILEAGEOUT, RETURNED, MILEAGEBACK,
 NOTES, MILEAGE, DAYS) = range(9)


class CarHireLog(object):

 def __init__(self, license, customer, hired, mileageout,
     returned=QDate(), mileageback=0, notes=""):
  self.license = license  # plain text
  self.customer = customer # plain text
  self.hired = hired     # QDate
  self.mileageout = mileageout   # int
  self.returned = returned    # QDate
  self.mileageback = mileageback  # int
  self.notes = notes   # HTML


 def field(self, column):
  if column == LICENSE:
   return self.license
  elif column == CUSTOMER:
   return self.customer
  elif column == HIRED:
   return self.hired
  elif column == MILEAGEOUT:
   return self.mileageout
  elif column == RETURNED:
   return self.returned
  elif column == MILEAGEBACK:
   return self.mileageback
  elif column == NOTES:
   return self.notes
  elif column == MILEAGE:
   return self.mileage()
  elif column == DAYS:
   return self.days()
  assert False


 def mileage(self):
  return (0 if self.mileageback == 0
     else self.mileageback - self.mileageout)


 def days(self):
  return (0 if not self.returned.isValid()
     else self.hired.daysTo(self.returned))


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


 def __eq__(self, other):
  if self.hired != other.hired:
   return False
  if self.customer != other.customer:
   return False
  if self.license != other.license:
   return False
  return id(self) == id(other)


 def __lt__(self, other):
  if self.hired < other.hired:
   return True
  if self.customer < other.customer:
   return True
  if self.license < other.license:
   return True
  return id(self) < id(other)


class CarHireModel(QAbstractTableModel):
 dataChanged = pyqtSignal(QModelIndex,QModelIndex)
 def __init__(self, parent=None):
  super(CarHireModel, self).__init__(parent)
  self.logs = []

  # Generate fake data
  import gzip
  import random
  import string
  surname_data = gzip.open(os.path.join(
    os.path.dirname(__file__), "surnames.txt.gz")).read()
  surnames = surname_data.decode("utf8").splitlines()
  years = ("06 ", "56 ", "07 ", "57 ", "08 ", "58 ")
  titles = ("Ms ", "Mr ", "Ms ", "Mr ", "Ms ", "Mr ", "Dr ")
  notetexts = ("Returned <font color=red><b>damaged</b></font>",
    "Returned with <i>empty fuel tank</i>",
    "Customer <b>complained</b> about the <u>engine</u>",
    "Customer <b>complained</b> about the <u>gears</u>",
    "Customer <b>complained</b> about the <u>clutch</u>",
    "Returned <font color=darkred><b>dirty</b></font>",)
  today = QDate.currentDate()
  for i in range(250):
   license = []
   for c in range(5):
    license.append(random.choice(string.ascii_uppercase))
   license = ("".join(license[:2]) + random.choice(years) +
      "".join(license[2:]))
   customer = random.choice(titles) + random.choice(surnames)
   hired = today.addDays(-random.randint(0, 365))
   mileageout = random.randint(10000, 30000)
   notes = ""
   if random.random() >= 0.2:
    days = random.randint(1, 21)
    returned = hired.addDays(days)
    mileageback = (mileageout +
        (days * random.randint(30, 300)))
    if random.random() > 0.75:
     notes = random.choice(notetexts)
   else:
    returned = QDate()
    mileageback = 0
   log = CarHireLog(license, customer, hired, mileageout,
        returned, mileageback, notes)
   bisect.insort(self.logs, log)


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


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


 def data(self, index, role):
  if not index.isValid():
   return QVariant()
  if role == Qt.DisplayRole:
   log = self.logs[index.row()]
   value = log.field(index.column())
   if (index.column() in (MILEAGEBACK, MILEAGE, DAYS) and
    value == 0):
    return 0
   return value
  if (role == Qt.TextAlignmentRole and
   index.column() not in (LICENSE, CUSTOMER, NOTES)):
   return QVariant(int(Qt.AlignRight|Qt.AlignVCenter))
  if role == Qt.BackgroundColorRole:
   palette = QApplication.palette()
   if index.column() in (LICENSE, MILEAGE, DAYS):
    return QVariant(palette.alternateBase())
   else:
    return QVariant(palette.base())
  return QVariant()


 def setData(self, index, value, role=Qt.EditRole):
  if (index.isValid() and role == Qt.EditRole and
   index.column() not in (LICENSE, MILEAGE, DAYS)):
   log = self.logs[index.row()]
   column = index.column()
   if column == CUSTOMER:
    log.customer = value
   elif column == HIRED:
    #log.hired = value.toDate()
    log.hired = value
   elif column == MILEAGEOUT:
    log.mileageout = value
   elif column == RETURNED:
    #log.returned = value.toDate()
    log.returned = value
   elif column == MILEAGEBACK:
    log.mileageback = value
   elif column == NOTES:
    log.notes = value
   self.dataChanged[QModelIndex,QModelIndex].emit(index,index)
   return True
  return False


 def headerData(self, section, orientation, role):
  if role == Qt.TextAlignmentRole:
   if orientation == Qt.Horizontal:
    return QVariant(int(Qt.AlignCenter))
   return QVariant(int(Qt.AlignRight|Qt.AlignVCenter))
  if role != Qt.DisplayRole:
   return QVariant()
  if orientation == Qt.Horizontal:
   if section == LICENSE:
    return "License"
   elif section == CUSTOMER:
    return "Customer"
   elif section == HIRED:
    return "Hired"
   elif section == MILEAGEOUT:
    return "Mileage #1"
   elif section == RETURNED:
    return "Returned"
   elif section == MILEAGEBACK:
    return "Mileage #2"
   elif section == DAYS:
    return "Days"
   elif section == MILEAGE:
    return "Miles"
   elif section == NOTES:
    return "Notes"
  return section + 1


 def flags(self, index):
  flag = QAbstractTableModel.flags(self, index)
  if index.column() not in (LICENSE, MILEAGE, DAYS):
   flag |= Qt.ItemIsEditable
  return flag


class HireDateColumnDelegate(genericdelegates.DateColumnDelegate):

 def createEditor(self, parent, option, index):
  i = index.sibling(index.row(), RETURNED)
  self.maximum = i.model().data(i, Qt.DisplayRole).addDays(-1)
  return genericdelegates.DateColumnDelegate.createEditor(
    self, parent, option, index)


class ReturnDateColumnDelegate(genericdelegates.DateColumnDelegate):

 def createEditor(self, parent, option, index):
  i = index.sibling(index.row(), HIRED)
  self.minimum = i.model().data(i, Qt.DisplayRole).addDays(1)
  return genericdelegates.DateColumnDelegate.createEditor(
    self, parent, option, index)


class MileageOutColumnDelegate(genericdelegates.IntegerColumnDelegate):

 def createEditor(self, parent, option, index):
  i = index.sibling(index.row(), MILEAGEBACK)
  maximum = i.model().data(i, Qt.DisplayRole)
  self.maximum = 1000000 if maximum == 0 else maximum - 1
  return genericdelegates.IntegerColumnDelegate.createEditor(
    self, parent, option, index)


class MileageBackColumnDelegate(genericdelegates.IntegerColumnDelegate):

 def createEditor(self, parent, option, index):
  i = index.sibling(index.row(), MILEAGEOUT)
  self.minimum = i.model().data(i, Qt.DisplayRole) + 1
  return genericdelegates.IntegerColumnDelegate.createEditor(
    self, parent, option, index)


class MainForm(QMainWindow):

 def __init__(self, parent=None):
  super(MainForm, self).__init__(parent)

  model = CarHireModel(self)

  self.view = QTableView()
  self.view.setModel(model)
  self.view.resizeColumnsToContents()

  delegate = genericdelegates.GenericDelegate(self)
  delegate.insertColumnDelegate(CUSTOMER,
    genericdelegates.PlainTextColumnDelegate())
  earliest = QDate.currentDate().addYears(-3)
  delegate.insertColumnDelegate(HIRED,
    HireDateColumnDelegate(earliest))
  delegate.insertColumnDelegate(MILEAGEOUT,
    MileageOutColumnDelegate(0, 1000000))
  delegate.insertColumnDelegate(RETURNED,
    ReturnDateColumnDelegate(earliest))
  delegate.insertColumnDelegate(MILEAGEBACK,
    MileageBackColumnDelegate(0, 1000000))
  delegate.insertColumnDelegate(NOTES,
    genericdelegates.RichTextColumnDelegate())

  self.view.setItemDelegate(delegate)
  self.setCentralWidget(self.view)

  QShortcut(QKeySequence("Escape"), self, self.close)
  QShortcut(QKeySequence("Ctrl+Q"), self, self.close)

  self.setWindowTitle("Car Hire Logs")


app = QApplication(sys.argv)
form = MainForm()
rect = QApplication.desktop().availableGeometry()
form.resize(int(rect.width() * 0.7), int(rect.height() * 0.8))
form.move(0, 0)
form.show()
app.exec_()

運(yùn)行結(jié)果:

python3+PyQt5泛型委托的示例分析

感謝各位的閱讀!關(guān)于“python3+PyQt5泛型委托的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)頁名稱:python3+PyQt5泛型委托的示例分析-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://aaarwkj.com/article26/isdjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、用戶體驗(yàn)網(wǎng)站排名、小程序開發(fā)、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
久久精品国产亚洲av无| 清纯少妇激情四射网站| 色哟哟国产精品一区自拍| 男人午夜福利视频在线观看| 精品欧美黑人一区二区| 韩国三级伦理中文字幕| 亚洲第一中文字幕久久| 人妻在线中文字幕一区| 亚洲精品一级理论片对面| 亚洲一区二区三区 日韩精品| 日韩精品人妻一区二区三区蜜桃臀| 中文字幕人妻少妇美臀| 亚洲成人高清在线视频| 久久精品91久久久| 国产亚洲精品视频热| 色噜噜噜欧美人妻色综合| 后入式动漫在线观看| 国产产品在线免费看91| 日本91一区二区不卡| 亚洲精品第一页中文字幕| 欧美日韩精品人妻中文| 精品一区二区久久久久久| 天天天干夜夜添狠操美女| 中文字幕av日韩在线| 日韩精品成人区中文字幕| 日本东京热免费一二三区| 高清国产在线播放91| 亚洲精品视频在线观看视频| 999久久久久亚洲精品| 人妻少妇久久久久久69| 亚洲欧美日韩国产亚洲欧美日韩国产 | 国产日韩欧美一区二区三区四区| 99在线视频午夜福利| 亚洲一区二区三区黄色| 国产一级一片内射在线| 成人午夜性色福利视频| 日韩在线一区中文字幕| 老司机午夜视频在线观看| 粗暴蹂躏中文一区二区三区| 日日做日夜夜操天天搞| 99热这里只有精品免费播放|