c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制
PyQt5提供了繪制圖形的API,支持繪制:
繪制圖形需要一個類QPainter。基本的繪制過程:
# 創建QPainter對象 painter = QPainter() ? # painter初始化 painter.begin() ? # 繪制文本 painter.drawText(...) ? # 結束繪制 painter.end()還有需要注意的是,繪制的場所必須是在painterEvent方法中。而這個painterEvent事件的方法會在主窗口剛剛生成時調用(生成繪制的圖形)、調整主窗口大小時調用(隨著主窗口的大小比例調整繪制圖像的大小比例)和關閉主窗口時調用(銷毀繪制的圖形)
在窗口上繪制文本
import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ? class DrawText(QWidget):def __init__(self):super(DrawText, self).__init__()self.setWindowTitle("在窗口上繪制文本")self.resize(300, 200)self.text = "Hello world" ?def paintEvent(self, event):painter = QPainter(self)painter.begin(self)# 加一個輸出,觀察什么情況下print("Done")# 設置畫筆顏色painter.setPen(QColor(150, 43, 5))# 設置字體painter.setFont(QFont("SimSun", 25))# 指定繪圖區域,對齊方式和繪制內容painter.drawText(event.rect(), Qt.AlignCenter, self.text)painter.end() ? if __name__ == '__main__':app = QApplication(sys.argv)main = DrawText()main.show()sys.exit(app.exec_())運行結果:
窗口剛剛彈出時,移動窗口時,放大放小窗口時,關閉窗口時。控制臺上都打印了“Done”,說明在這幾類情況下,主事件調用了paintEvent()方法需要注意的是,paintEvent()是內置的事件方法,我們只是重載了,故初始化中沒有調用paintEvent(),但是,實際上主循環內部自動地調用了它。所以,這個方法的名字不是我們任意起的,而是固定的(如果不是paintEvent()而是其他什么的,程序就無法正常顯示繪制的內容)。
還有需要注意的是,使用painter.begin()初始化時,為了體現是固定在主窗口上創建的,必須要填入參數self。
對于其中的painter.drawText()方法,需要說明其中的第一個參數:
painter.drawText(event.rect(), Qt.AlignCenter, self.text)第一個參數是指定的繪圖區域,此處的event.rect()指的是主事件的矩形區域,也就是整個主窗口,除此之外,可以通過指定x和y來指定繪圖區域,后面會講解。
用像素點繪制正弦曲線
PyQt5中的drawPoint可以繪制一個像素點,參數是x與y。
import sys,math from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ? class DrawPoints(QWidget):def __init__(self):super(DrawPoints, self).__init__()self.setWindowTitle("用像素點繪制正弦曲線")self.resize(300, 300) ?def paintEvent(self, event):painter = QPainter()painter.begin(self) ?painter.setPen(Qt.blue)size = self.size() ?for i in range(1000):x = 100 * (-1 + 2 * i / 1000) + size.width() / 2y = -50 * math.sin((x - size.width() / 2) * math.pi / 50) + size.height() / 2painter.drawPoint(int(x), int(y))painter.end() ? if __name__ == '__main__':app = QApplication(sys.argv)main = DrawPoints()main.show()sys.exit(app.exec_())運行效果:
繪制不同類型的直線
import sys,math from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ? class DrawMultiLine(QWidget):def __init__(self):super(DrawMultiLine, self).__init__()self.setWindowTitle("繪制不同類型的直線")self.resize(300, 300) ?def paintEvent(self, event):painter = QPainter()painter.begin(self) ?# 顏色, 粗細, 線條類型(默認為Qt.SolidLine,即實線)pen = QPen(Qt.red, 3, Qt.SolidLine)painter.setPen(pen)painter.drawLine(20, 40, 250, 40) ?# 點線pen.setStyle(Qt.DashDotLine)painter.setPen(pen)painter.drawLine(20 ,80, 250, 80) ?# 點點線pen.setStyle(Qt.DashDotDotLine)painter.setPen(pen)painter.drawLine(20, 120, 250 ,120) ?# 自定義點線風格pen.setStyle(Qt.CustomDashLine)pen.setDashPattern([1, 10, 5, 8])painter.setPen(pen)painter.drawLine(20, 200, 250, 200) ?painter.end() ? ? if __name__ == '__main__':app = QApplication(sys.argv)main = DrawMultiLine()main.show()sys.exit(app.exec_())運行結果:
- drawLine(a, b, c, d):從坐標為(a,b)的點繪制到(c,d)的點的線段。
- 窗口坐標系:(a,b)代表離窗口左側為a個像素點,離窗口最上側為b個像素點。
繪制各種圖形
繪制弧
import sys,math from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ? class DrawAll(QWidget):def __init__(self):super(DrawAll, self).__init__()self.setWindowTitle("繪制各種圖形")self.resize(300, 300) ?def paintEvent(self, event):qp = QPainter()qp.begin(self) ?qp.setPen(Qt.blue) ?# 繪制弧# 先選定繪制區域,繪制區域為矩形(QRect)# 左上角坐標為(0, 10), 長為100, 寬為100rect = QRect(0, 10, 100, 100)# 弧為圓的一部分,角度的單位是alen:1個alen等于1/16度# 下面在rect代表的區域中繪制,起始角度為0,終止角度為50度(50 * 16 alen)qp.drawArc(rect, 0, 50 * 16) ?qp.end() ? ? if __name__ == '__main__':app = QApplication(sys.argv)main = DrawAll()main.show()sys.exit(app.exec_())運行結果:
繪制圓:# 通過弧繪制圓 qp.setPen(Qt.red) qp.drawArc(120, 10, 100, 100, 0, 360 * 16)運行結果:
可以看到,除了使用QRect對象指定繪圖區域,我們還可以直接初始化QRect的四個參數直接填入drawArc函數中作為前四個參數;起始位置為0,終止為止為360度的弧就是圓。
繪制帶弦的弧:# 繪制帶弦的弧 qp.drawChord(10, 120, 100, 100, 12, 130 * 16)運行結果:
繪制扇形# 繪制扇形 qp.drawPie(10, 240, 100, 100, 12, 130 * 16)運行結果:
繪制橢圓# 繪制橢圓 qp.drawEllipse(120, 120, 150, 100)運行結果:
繪制橢圓只需要指定繪圖區域,繪制出的橢圓就是指定的矩形區域的內接橢圓。所以,我們可以通過指定正方形區域來繪制圓。
繪制5邊形 # 繪制5邊形 point1 = QPoint(140, 380) point2 = QPoint(270, 420) point3 = QPoint(290, 512) point4 = QPoint(290, 588) point5 = QPoint(200, 533) ? polygon = QPolygon([point1, point2, point3, point4, point5]) qp.drawPolygon(polygon)運行結果:
多邊形的繪制機制也蠻顯然的,通過創建多個QPoint對象指定多邊形的每個頂點的坐標,再用這幾個代表像素點的QPoint對象去初始化一個QPolygon對象,這個QPolygon對象作為drawPolygon的參數完成繪制。
繪制圖像# 繪制圖像 image = QImage("./image/pic2.png") rect = QRect(300, 200, 300, 230) qp.drawImage(rect, image)運行結果:
用畫刷填充圖形區域
import sys,math from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ? class FillRect(QWidget):def __init__(self):super(FillRect, self).__init__()self.setWindowTitle("用畫刷填充圖形區域")self.resize(360, 300) ?def paintEvent(self, event):qp = QPainter()qp.begin(self) ?# 實心畫刷brush = QBrush(Qt.SolidPattern)qp.setBrush(brush)qp.drawRect(10, 15, 90, 60) ?# 點陣畫刷(類型1)brush = QBrush(Qt.Dense1Pattern)qp.setBrush(brush)qp.drawRect(130, 15, 90, 60) ?# 點陣畫刷(類型2)brush = QBrush(Qt.Dense2Pattern)qp.setBrush(brush)qp.drawRect(250, 15, 90, 60) ?# 點陣畫刷(類型3)brush = QBrush(Qt.Dense3Pattern)qp.setBrush(brush)qp.drawRect(10, 105, 90, 60) ?# 點陣畫刷(類型4)brush = QBrush(Qt.Dense4Pattern)qp.setBrush(brush)qp.drawRect(130, 105, 90, 60) ?# 點陣畫刷(類型5)brush = QBrush(Qt.Dense5Pattern)qp.setBrush(brush)qp.drawRect(250, 105, 90, 60) ?# 點陣畫刷(類型6)brush = QBrush(Qt.Dense6Pattern)qp.setBrush(brush)qp.drawRect(10, 195, 90, 60) ?# 點陣畫刷(類型7)brush = QBrush(Qt.Dense7Pattern)qp.setBrush(brush)qp.drawRect(130, 195, 90, 60) ?# 橫格畫刷brush = QBrush(Qt.HorPattern)qp.setBrush(brush)qp.drawRect(250, 195, 90, 60) ?qp.end() ? ? if __name__ == '__main__':app = QApplication(sys.argv)main = FillRect()main.show()sys.exit(app.exec_())運行結果:
每創建一個畫刷對象,都需要調用QPainter對象的setBrush()方法設置畫刷。
總結
以上是生活随笔為你收集整理的c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Andriod开发 --插件安装、环境配
- 下一篇: xx闪购—主体选项卡