PyQt5——視窗繪圖類控制元件

ckxllf發表於2019-09-19

  視窗繪圖類控制元件

  在PyQt5中,一般可以透過QPainter、QPen和QBrush這三個類來實現繪圖的功能。

  QPainter

  QPainter類在QWidget上執行繪圖操作,它是一個繪製工具,為大部分圖形介面提供了高度最佳化的函式,是QPainter類可以繪製從簡單的直線到複雜的餅圖。

  繪製操作在QWidget.painEvent()中完成,繪製方法必須放在QtGui.QPainter物件的begin()和end()之間。QPainter類在控制元件或其他繪圖裝置上執行較低階別的圖形繪製功能。

  方法

  方法  描述

  begin()  開始在目標裝置上繪製

  drawArc()  在起始角度和最終角度之間畫弧

  drawEllipse()  在一個矩形內畫一個橢圓

  drawLine(int x1,int y1,int x2,int y2)  繪製一條指定了端點座標的線。

  drawPixmap()  從影像檔案中提取Pixmap並將其顯示在指定的位置

  drawPolygon()  使用座標陣列繪製多邊形

  drawReact()  給定寬度w和高度h從左上角(x,y)繪製一個矩形

  drawText()  顯示給定座標處的文字

  fillRect()  使用QColor引數填充矩形

  setBrush()  設定畫筆風格

  setPen()  設定用於繪製的筆的顏色、大小和樣式

  還可以設定畫筆風格(PenStyle),這是一個列舉類,可以由QPainter類繪製。

  列舉型別  描述

  Qt.NoPen  沒有線,比如QPainter.drawRect()填充,但沒有繪製任何邊界線

  Qt.SolidLine  一個簡單的線

  Qt.DashLine  由一些畫素分隔的短線

  Qt.DotLine  由一些畫素分割點

  Qt.DashDotLine  輪流交替的點和短線

  Qt.DashDotDotLine  一個短線、兩個點

  Qt.MPenStyle  畫筆風格的掩碼

  # -*- coding: utf-8 -*-

  import sys

  from PyQt5.QtWidgets import QApplication, QWidget

  from PyQt5.QtGui import QPainter, QColor, QFont

  from PyQt5.QtCore import Qt

  class Drawing(QWidget):

  def __init__(self, parent = None):

  super(Drawing, self).__init__(parent)

  self.setWindowTitle("在視窗中繪製文字")

  self.resize(300,200)

  self.text = '歡迎學習 PyQt5'

  def paintEvent(self, event):

  painter = QPainter(self)

  painter.begin(self)

  # 自定義繪製方法

  self.drawText(event, painter)

  painter.end()

  def drawText(self, event, qp):

  qp.setPen(QColor(168, 34, 3))

  qp.setFont(QFont('SimSun', 20))

  qp.drawText(event.rect(), Qt.AlignCenter, self.text)

  if __name__ == '__main__':

  app = QApplication(sys.argv)

  demo = Drawing()

  demo.show()

  sys.exit(app.exec_())

  # -*- coding: utf-8 -*-

  import sys, math

  from PyQt5.QtWidgets import *

  from PyQt5.QtGui import *

  from PyQt5.QtCore import *

  class Drawing(QWidget):

  def __init__(self, parent = None):

  super(Drawing, self).__init__(parent)

  self.resize(300,200)

  self.setWindowTitle("在視窗中畫點")

  def paintEvent(self, event):

  qp = QPainter(self)

  qp.begin(self)

  self.drawPoints(qp)

  qp.end()

  def drawPoints(self,qp):

  qp.setPen(Qt.red)

  size = self.size()

  for i in range(1000):

  x = 100 * (-1+2.0 * i /1000) + size.width()/2.0

  y = -50 * math.sin((x-size.width()/2.0)*math.pi /50)+size.height()/2.0

  qp.drawPoint(x ,y)

  if __name__ == '__main__':

  app = QApplication(sys.argv)

  demo = Drawing()

  demo.show()

  sys.exit(app.exec_())

  QPen

  QPen是一個基本的圖形物件,用於繪製直線、曲線或者輪廓畫出矩形、橢圓形、多邊形以及其他形狀。

  # -*- coding: utf-8 -*-

  import sys

  from PyQt5.QtWidgets import *

  from PyQt5.QtGui import *

  from PyQt5.QtCore import *

  class Drawing(QWidget):

  def __init__(self):

  super().__init__()

  self.initUI()

  def initUI(self):

  self.setGeometry(300,300,280,270)

  self.setWindowTitle("鋼筆樣式例子")

  def paintEvent(self, QPaintEvent):

  qp = QPainter()

  qp.begin(self)

  self.drawLines(qp)

  qp.end()

  def drawLines(self, qp):

  pen = QPen(Qt.black, 2, Qt.SolidLine)

  qp.setPen(pen)

  qp.drawLine(20,40,250,40)

  pen.setStyle(Qt.DashLine)

  qp.setPen(pen)

  qp.drawLine(20,80, 250,80)

  pen.setStyle(Qt.DashDotLine)

  qp.setPen(pen)

  qp.drawLine(20,120,250,120)

  pen.setStyle(Qt.DotLine)

  qp.setPen(pen)

  qp.drawLine(20,160,250,160)

  pen.setStyle(Qt.DashDotDotLine)

  qp.setPen(pen)

  qp.drawLine(20,200,250,200)

  pen.setStyle(Qt.CustomDashLine)

  pen.setDashPattern([1,4,5,4])

  qp.setPen(pen)

  qp.drawLine(20,240,250,240)

  if __name__ == '__main__':

  app = QApplication(sys.argv)

  demo = Drawing()

  demo.show()

  sys.exit(app.exec_())

  使用Qt.CustomDashLine建立線條樣式,然後呼叫setDashPattern()方法使用數字列表定義樣式,數字列表的個數必須是偶數,在本例中數字列表[1,4,5,4]它的個數是4,奇數位代表一段橫線,偶數為代表兩端橫線之間的空餘距離。

  QBrush

  QBrush是一個基本的圖形物件,用於填充如矩形、橢圓形或多邊形等形狀。QBrush有三種型別:預定義、過渡和紋理圖案。 無錫看婦科的醫院

  # -*- coding: utf-8 -*-

  import sys

  from PyQt5.QtWidgets import *

  from PyQt5.QtGui import *

  from PyQt5.QtCore import Qt

  class Drawing(QWidget):

  def __init__(self):

  super().__init__()

  self.initUI()

  def initUI(self):

  self.setGeometry(300,300,365,280)

  self.setWindowTitle("畫刷例子")

  self.show()

  def paintEvent(self, QPaintEvent):

  qp = QPainter()

  qp.begin(self)

  self.drawLines(qp)

  qp.end()

  def drawLines(self,qp):

  brush = QBrush(Qt.SolidPattern)

  qp.setBrush(brush)

  qp.drawRect(10,15,90,60)

  brush = QBrush(Qt.Dense1Pattern)

  qp.setBrush(brush)

  qp.drawRect(130, 15, 90, 60)

  brush = QBrush(Qt.Dense2Pattern)

  qp.setBrush(brush)

  qp.drawRect(250, 15, 90, 60)

  brush = QBrush(Qt.Dense3Pattern)

  qp.setBrush(brush)

  qp.drawRect(10, 105, 90, 60)

  brush = QBrush(Qt.DiagCrossPattern)

  qp.setBrush(brush)

  qp.drawRect(10, 105, 90, 60)

  brush = QBrush(Qt.Dense5Pattern)

  qp.setBrush(brush)

  qp.drawRect(130, 105, 90, 60)

  brush = QBrush(Qt.Dense6Pattern)

  qp.setBrush(brush)

  qp.drawRect(250, 105, 90, 60)

  brush = QBrush(Qt.HorPattern)

  qp.setBrush(brush)

  qp.drawRect(10, 195, 90, 60)

  brush = QBrush(Qt.VerPattern)

  qp.setBrush(brush)

  qp.drawRect(130, 195, 90, 60)

  brush = QBrush(Qt.BDiagPattern)

  qp.setBrush(brush)

  qp.drawRect(250, 195, 90, 60)

  if __name__ =='__main__':

  app = QApplication(sys.argv)

  demo = Drawing()

  demo.show()

  sys.exit(app.exec_())

  QPixmap

  QPixmap類用於繪圖裝置的影像顯示,可以作為一個QPaintDevice物件,也可以載入到一個控制元件中,通常是標籤或者按鈕,用於在標籤或按鈕上顯示影像。

  QPixmap可以讀取的影像檔案型別有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。

  常用的方法

  方法  描述

  copy()  從QRect物件複製到QPixmap物件

  fromImage()  將QImage物件轉換為QPixmap物件

  gradWidget()  從給定的視窗小控制元件建立一個畫素圖

  load()  載入影像檔案作為QPixmap物件

  save()  將QPixmap物件儲存為檔案

  toImage()  將QPixmap物件轉換為QImage物件

  # -*- coding: utf-8 -*-

  import sys

  from PyQt5.QtCore import *

  from PyQt5.QtGui import *

  from PyQt5.QtWidgets import *

  if __name__ == '__main__':

  app = QApplication(sys.argv)

  win = QWidget()

  labl = QLabel()

  labl.setPixmap(QPixmap("./images/python.jpg"))

  vbox = QVBoxLayout()

  vbox.addWidget(labl)

  win.setLayout(vbox)

  win.setWindowTitle("QPixmap例子")

  win.show()

  sys.exit(app.exec_())


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2657546/,如需轉載,請註明出處,否則將追究法律責任。

相關文章