PyQt5學習筆記---組件2---繪圖類、剪切板

        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_())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章