日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制

發(fā)布時(shí)間:2023/12/10 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PyQt5提供了繪制圖形的API,支持繪制:

  • 文本
  • 各種圖形(直線(xiàn),點(diǎn),橢圓,弧,扇形,多邊形等)
  • 圖像
  • 繪制圖形需要一個(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。