PyQt5中的繪圖類QPainter該類在QWidget上執行繪圖操作,是一個繪圖工具,爲大部分圖形界面提供了高度優化的函數。可繪製直線或者複雜的餅圖等。繪製操作在QWidget.paintEvent()中完成。繪製方法必須放在QtGui.QPainter對象的begin()和end()之間。繪製一些較低級別的圖形繪製功能。
常用方法
begin() |
開始在目標設備上繪製 |
drawArc() |
在起始角度和最終角度之間畫弧線 |
drawEllipse() |
在一個矩形內畫一個橢圓 |
drawLine(int x1,int y1,int x1,int y1) |
繪製一條制定了斷點座標的線,繪製從(x1,y1)到(x2,y2)的直線並且設置當前畫筆位置爲(x2,y2) |
drawPixmap() |
從圖像文件中提取Pixmap並將其現在指定的位置 |
drawPolygon() |
使用座標數組繪製多邊形 |
drawRect(int x,int y,int w,int h) |
以給定的寬度w和高度h從左上角座標(x,y)繪製一個矩形 |
drawText() |
顯示給定座標處的文字 |
fillRect() |
使用QColor參數填充矩形 |
setBrush() |
設置畫筆風格 |
setPen() |
設置用於繪製的筆的顏色,大小、樣式 |
設置畫筆風格
Qt.NoPen |
沒有線,比如QPainter.drawRect()填充,但沒有繪製任何邊界線 |
Qt.SolidLine |
一條簡單的線 |
Qt.DashLine |
由一些像素分隔的短線 |
Qt.DotLine |
由一些像素分割的點 |
Qt.DashDotLine |
輪流交替的點和短線 |
Qt.DashDotDotLine |
一條短線、兩個點 |
Qt.MPenStyle |
畫筆風格的掩碼 |
繪製文字案例
#QPainter類繪製文字實例
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Drawing(QWidget):
def __init__(self,parent=None):
super(Drawing, self).__init__(parent)
self.setWindowTitle("在窗口中繪製文字")
self.resize(300,200)
self.text="welcome to learn qt5"
#定義一個繪製事件
def paintEvent(self, QPaintEvent):
self.painter=QPainter(self)
self.painter.begin(self) #此處需要加參數self
#自定義繪製方法
self.drawText(QPaintEvent,self.painter)
self.painter.end() #此處不需要參數self
def drawText(self,event,qp):
#設置畫筆顏色
qp.setPen(QColor(168,34,3))
#設置字體
qp.setFont(QFont('SimSun',20))
#繪製文字
qp.drawText(event.rect(),Qt.AlignCenter,self.text)
#繪製點
def drawPoints(self,qp):
qp.setPen(Qt.red)
size=self.size()
for i in range(1000):
#繪製正弦函數圖形,它的週期是[-100,100]
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,math
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Drawing(QWidget):
def __init__(self,parent=None):
super(Drawing, self).__init__(parent)
self.initUI()
def initUI(self):
self.setGeometry(300,300,280,270)
self.setWindowTitle("鋼筆樣式例子")
def paintEvent(self, QPaintEvent):
qp=QPainter()
qp.begin(self)
self.drawLine(qp)
qp.end()
def drawLine(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.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_())
QBrush:畫刷,一個基本的圖形對象,用於填充矩形、橢圓、多邊形等。類型:預定義、過渡、紋理
#QBrush類對象實例
# -*- coding: utf-8 -*-
import sys,math
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Drawing(QWidget):
def __init__(self,parent=None):
super(Drawing, self).__init__(parent)
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:該控件用於繪圖設備的圖像顯示,是一個QPaintDevice對象。可加載到一個控件中,通常是標籤或者按鈕上顯示圖像
QPixmap可讀取的圖像文件的類型有:BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM
常用方法
copy() |
從QRect對象複製到QPixmap對象 |
fromImage() |
將QImage對象轉換爲QPixmap對象 |
grabWidget() |
從給定的窗口小控件創建一個像素圖 |
grabWindow() |
在窗口中創建數據的像素圖 |
load() |
加載圖像文件作爲QPixmap對象 |
save() |
將QPixmap對象保存爲文件 |
toImage() |
將QPixmap對象轉換爲QImage對象 |
#QPixmap類對象實例
# -*- coding: utf-8 -*-
import sys,math
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
if __name__=="__main__":
app=QApplication(sys.argv)
win=QWidget()
lab1=QLabel()
lab1.setPixmap(QPixmap("../images/resize.png"))
vbox=QVBoxLayout()
vbox.addWidget(lab1)
win.setLayout(vbox)
win.setWindowTitle("QPixmap")
win.show()
sys.exit(app.exec_())
Drag Drop:拖拽,基於MIME類型的拖拽數據傳輸時基於QDrag類,QMimeData對象將關聯的數據與其對應的MIME類型相關聯。
MIME:多用途互聯網郵件擴展類型
常見MIME類型:HTML文本、XML文本、XHTML文本、txt文本、RTF文本、PDF文本、word文本、PNG、GIF、JPEG、聲音文件、MIDI音樂文件、RealAudio音樂文本、MPEG文本、AVI、GZIP、TAR、二進制數據。
常用拖拽事件
DragEnterEvent |
當執行一個拖拽控件操作,並且鼠標指針進入該控件時,事件將被觸發,在該事件中可以獲得被操作的窗口控件,還可以有條件的接受或拒絕該拖拽操作 |
DragMoveEvent |
在拖拽操作進行時觸發 |
DragLeaveEvent |
當執行一個拖拽控件操作時,並且鼠標指針離開該控件,該事件被觸發 |
DropEvent |
當拖拽操作在目標控件上被釋放時,該事件被觸發。 |
#QDrop拖拽類對象實例
# -*- coding: utf-8 -*-
import sys,math
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Combo(QComboBox):
def __init__(self,title,parent):
super(Combo, self).__init__(parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
print(event)
if event.mimeData().hasText():
event.accept()
else:
event.ignore()
def dropEvent(self, event):
self.addItem(event.mimeData().text())
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
lo=QFormLayout()
lo.addRow(QLabel("請把左邊的文本拖拽到右邊的下拉菜單中"))
edit=QLineEdit()
edit.setDragEnabled(True)
com=Combo("Button",self)
lo.addRow(edit,com)
self.setLayout(lo)
self.setWindowTitle("拖拽")
if __name__=="__main__":
app=QApplication(sys.argv)
demo=Example()
demo.show()
sys.exit(app.exec_())
Tips:注:拖拽時,全選中文本,點擊鼠標左鍵按住拖動
QClipboard 剪切板:該類提供了對系統剪切板的訪問,可在程序之間複製和粘貼數據
常用方法:
clear() |
清除剪切板內容 |
setImage() |
將QImage對象複製到剪切板 |
setMimeData() |
將MIME數據設爲剪切板 |
setPixmap() |
從剪切板中複製Pixmap對象 |
setText() |
從剪切板中複製文本 |
text() |
從剪切板中檢索文本 |
常用信號 槽
dataChanged |
剪切板內容發生變化,信號被髮射 |
#QClidboard剪切板實例
# -*- coding: utf-8 -*-
import sys,math,os
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Form(QDialog):
def __init__(self,parent=None):
super(Form, self).__init__(parent)
textCopyButton=QPushButton("&Copy Text")
textPasteButton=QPushButton("Paste &Text")
htmlCopyButton=QPushButton("C&opy HTML")
htmlPasteButton=QPushButton("Paste &HTML")
imageCopyButton=QPushButton("Co&py Image")
imagePasteButton=QPushButton("Paste &Image")
self.textLable=QLabel("Original text")
self.imageLable=QLabel()
self.imageLable.setPixmap(QPixmap(os.path.join(os.path.dirname(__file__),"../images/resize.png")))
layout=QGridLayout()
layout.addWidget(textCopyButton,0,0)
layout.addWidget(imageCopyButton, 0, 1)
layout.addWidget(htmlCopyButton, 0, 2)
layout.addWidget(textPasteButton, 1, 0)
layout.addWidget(imagePasteButton, 1, 1)
layout.addWidget(htmlPasteButton, 1, 2)
layout.addWidget(self.textLable,2, 0,1,2)
layout.addWidget(self.imageLable, 2, 2)
self.setLayout(layout)
textCopyButton.clicked.connect(self.copyText)
textPasteButton.clicked.connect(self.pasteText)
htmlCopyButton.clicked.connect(self.copyHtml)
htmlPasteButton.clicked.connect(self.pasteHtml)
imageCopyButton.clicked.connect(self.copyImage)
imagePasteButton.clicked.connect(self.pasteImage)
self.setWindowTitle("剪切板")
def copyText(self):
clipboard=QApplication.clipboard()
clipboard.setText("I've been clipboard")
def pasteText(self):
clipboard=QApplication.clipboard()
self.textLable.setText(clipboard.text())
def copyImage(self):
clipboard=QApplication.clipboard()
clipboard.setPixmap(QPixmap(os.path.join(os.path.dirname(__file__),"../images/resize.png")))
def pasteImage(self):
clipboard=QApplication.clipboard()
self.imageLable.setPixmap(clipboard.pixmap())
def copyHtml(self):
mimeData=QMimeData()
mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>")
clipboard=QApplication.clipboard()
clipboard.setMimData(mimeData)
def pasteHtml(self):
clipboard=QApplication.clipboard()
mimeData=clipboard.mimeData()
if mimeData.hasHtml():
self.textLable.setText(mimeData.html())
if __name__=="__main__":
app=QApplication(sys.argv)
demo=Form()
demo.show()
sys.exit(app.exec_())