c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制
PyQt5提供了繪制圖形的API,支持繪制:
繪制圖形需要一個(gè)類(lèi)QPainter。基本的繪制過(guò)程:
# 創(chuàng)建QPainter對(duì)象 painter = QPainter() ? # painter初始化 painter.begin() ? # 繪制文本 painter.drawText(...) ? # 結(jié)束繪制 painter.end()還有需要注意的是,繪制的場(chǎng)所必須是在painterEvent方法中。而這個(gè)painterEvent事件的方法會(huì)在主窗口剛剛生成時(shí)調(diào)用(生成繪制的圖形)、調(diào)整主窗口大小時(shí)調(diào)用(隨著主窗口的大小比例調(diào)整繪制圖像的大小比例)和關(guān)閉主窗口時(shí)調(diào)用(銷(xiāo)毀繪制的圖形)
在窗口上繪制文本
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)# 加一個(gè)輸出,觀察什么情況下print("Done")# 設(shè)置畫(huà)筆顏色painter.setPen(QColor(150, 43, 5))# 設(shè)置字體painter.setFont(QFont("SimSun", 25))# 指定繪圖區(qū)域,對(duì)齊方式和繪制內(nèi)容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_())運(yùn)行結(jié)果:
窗口剛剛彈出時(shí),移動(dòng)窗口時(shí),放大放小窗口時(shí),關(guān)閉窗口時(shí)。控制臺(tái)上都打印了“Done”,說(shuō)明在這幾類(lèi)情況下,主事件調(diào)用了paintEvent()方法需要注意的是,paintEvent()是內(nèi)置的事件方法,我們只是重載了,故初始化中沒(méi)有調(diào)用paintEvent(),但是,實(shí)際上主循環(huán)內(nèi)部自動(dòng)地調(diào)用了它。所以,這個(gè)方法的名字不是我們?nèi)我馄鸬?#xff0c;而是固定的(如果不是paintEvent()而是其他什么的,程序就無(wú)法正常顯示繪制的內(nèi)容)。
還有需要注意的是,使用painter.begin()初始化時(shí),為了體現(xiàn)是固定在主窗口上創(chuàng)建的,必須要填入?yún)?shù)self。
對(duì)于其中的painter.drawText()方法,需要說(shuō)明其中的第一個(gè)參數(shù):
painter.drawText(event.rect(), Qt.AlignCenter, self.text)第一個(gè)參數(shù)是指定的繪圖區(qū)域,此處的event.rect()指的是主事件的矩形區(qū)域,也就是整個(gè)主窗口,除此之外,可以通過(guò)指定x和y來(lái)指定繪圖區(qū)域,后面會(huì)講解。
用像素點(diǎn)繪制正弦曲線(xiàn)
PyQt5中的drawPoint可以繪制一個(gè)像素點(diǎn),參數(shù)是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("用像素點(diǎn)繪制正弦曲線(xiàn)")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_())運(yùn)行效果:
繪制不同類(lèi)型的直線(xiàn)
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("繪制不同類(lèi)型的直線(xiàn)")self.resize(300, 300) ?def paintEvent(self, event):painter = QPainter()painter.begin(self) ?# 顏色, 粗細(xì), 線(xiàn)條類(lèi)型(默認(rèn)為Qt.SolidLine,即實(shí)線(xiàn))pen = QPen(Qt.red, 3, Qt.SolidLine)painter.setPen(pen)painter.drawLine(20, 40, 250, 40) ?# 點(diǎn)線(xiàn)pen.setStyle(Qt.DashDotLine)painter.setPen(pen)painter.drawLine(20 ,80, 250, 80) ?# 點(diǎn)點(diǎn)線(xiàn)pen.setStyle(Qt.DashDotDotLine)painter.setPen(pen)painter.drawLine(20, 120, 250 ,120) ?# 自定義點(diǎn)線(xiàn)風(fēng)格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_())運(yùn)行結(jié)果:
- drawLine(a, b, c, d):從坐標(biāo)為(a,b)的點(diǎn)繪制到(c,d)的點(diǎn)的線(xiàn)段。
- 窗口坐標(biāo)系:(a,b)代表離窗口左側(cè)為a個(gè)像素點(diǎn),離窗口最上側(cè)為b個(gè)像素點(diǎn)。
繪制各種圖形
繪制弧
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) ?# 繪制弧# 先選定繪制區(qū)域,繪制區(qū)域?yàn)榫匦?#xff08;QRect)# 左上角坐標(biāo)為(0, 10), 長(zhǎng)為100, 寬為100rect = QRect(0, 10, 100, 100)# 弧為圓的一部分,角度的單位是alen:1個(gè)alen等于1/16度# 下面在rect代表的區(qū)域中繪制,起始角度為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_())運(yùn)行結(jié)果:
繪制圓:# 通過(guò)弧繪制圓 qp.setPen(Qt.red) qp.drawArc(120, 10, 100, 100, 0, 360 * 16)運(yùn)行結(jié)果:
可以看到,除了使用QRect對(duì)象指定繪圖區(qū)域,我們還可以直接初始化QRect的四個(gè)參數(shù)直接填入drawArc函數(shù)中作為前四個(gè)參數(shù);起始位置為0,終止為止為360度的弧就是圓。
繪制帶弦的弧:# 繪制帶弦的弧 qp.drawChord(10, 120, 100, 100, 12, 130 * 16)運(yùn)行結(jié)果:
繪制扇形# 繪制扇形 qp.drawPie(10, 240, 100, 100, 12, 130 * 16)運(yùn)行結(jié)果:
繪制橢圓# 繪制橢圓 qp.drawEllipse(120, 120, 150, 100)運(yùn)行結(jié)果:
繪制橢圓只需要指定繪圖區(qū)域,繪制出的橢圓就是指定的矩形區(qū)域的內(nèi)接橢圓。所以,我們可以通過(guò)指定正方形區(qū)域來(lái)繪制圓。
繪制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)運(yùn)行結(jié)果:
多邊形的繪制機(jī)制也蠻顯然的,通過(guò)創(chuàng)建多個(gè)QPoint對(duì)象指定多邊形的每個(gè)頂點(diǎn)的坐標(biāo),再用這幾個(gè)代表像素點(diǎn)的QPoint對(duì)象去初始化一個(gè)QPolygon對(duì)象,這個(gè)QPolygon對(duì)象作為drawPolygon的參數(shù)完成繪制。
繪制圖像# 繪制圖像 image = QImage("./image/pic2.png") rect = QRect(300, 200, 300, 230) qp.drawImage(rect, image)運(yùn)行結(jié)果:
用畫(huà)刷填充圖形區(qū)域
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("用畫(huà)刷填充圖形區(qū)域")self.resize(360, 300) ?def paintEvent(self, event):qp = QPainter()qp.begin(self) ?# 實(shí)心畫(huà)刷brush = QBrush(Qt.SolidPattern)qp.setBrush(brush)qp.drawRect(10, 15, 90, 60) ?# 點(diǎn)陣畫(huà)刷(類(lèi)型1)brush = QBrush(Qt.Dense1Pattern)qp.setBrush(brush)qp.drawRect(130, 15, 90, 60) ?# 點(diǎn)陣畫(huà)刷(類(lèi)型2)brush = QBrush(Qt.Dense2Pattern)qp.setBrush(brush)qp.drawRect(250, 15, 90, 60) ?# 點(diǎn)陣畫(huà)刷(類(lèi)型3)brush = QBrush(Qt.Dense3Pattern)qp.setBrush(brush)qp.drawRect(10, 105, 90, 60) ?# 點(diǎn)陣畫(huà)刷(類(lèi)型4)brush = QBrush(Qt.Dense4Pattern)qp.setBrush(brush)qp.drawRect(130, 105, 90, 60) ?# 點(diǎn)陣畫(huà)刷(類(lèi)型5)brush = QBrush(Qt.Dense5Pattern)qp.setBrush(brush)qp.drawRect(250, 105, 90, 60) ?# 點(diǎn)陣畫(huà)刷(類(lèi)型6)brush = QBrush(Qt.Dense6Pattern)qp.setBrush(brush)qp.drawRect(10, 195, 90, 60) ?# 點(diǎn)陣畫(huà)刷(類(lèi)型7)brush = QBrush(Qt.Dense7Pattern)qp.setBrush(brush)qp.drawRect(130, 195, 90, 60) ?# 橫格畫(huà)刷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_())運(yùn)行結(jié)果:
每創(chuàng)建一個(gè)畫(huà)刷對(duì)象,都需要調(diào)用QPainter對(duì)象的setBrush()方法設(shè)置畫(huà)刷。
總結(jié)
以上是生活随笔為你收集整理的c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Andriod开发 --插件安装、环境配
- 下一篇: s3c2440移植MQTT