• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 41, 文章 - 8, 評(píng)論 - 8, 引用 - 0
            數(shù)據(jù)加載中……

            [Python][PyQt4]在 PyQt4 中繪圖

            在 PyQt4 中繪圖

            繪圖常用于,當(dāng)我們想改變一個(gè)已存在的組件,或者是我們希望自己創(chuàng)建組件。為了實(shí)現(xiàn)繪圖,我們可以使用 PyQt4 中提供的 API 。

            繪制一般由 paintEvent() 方法處理。繪制的代碼放置于 QtGui.QPainter 對(duì)象的 begin()end() 之間。

            繪制文本

            我們可以把一些 Unicode 文本繪制到屏幕上。

            #!/usr/bin/python
            # -*- coding: utf-8 -*-
            """
            ZetCode PyQt4 tutorial
            In this example, we draw text in Russian azbuka.
            author: Jan Bodnar
            website: zetcode.com
            last edited: September 2011
            """
            import sys
            from PyQt4 import QtGui, QtCore
            class Example(QtGui.QWidget):
                def __init__(self):
                    super(Example, self).__init__()
                    self.initUI()
                def initUI(self):
                    self.text = u'\u041b\u0435\u0432 \u041d\u0438\u043a\u043e\u043b\u0430\
            \u0435\u0432\u0438\u0447 \u0422\u043e\u043b\u0441\u0442\u043e\u0439: \n\
            \u0410\u043d\u043d\u0430 \u041a\u0430\u0440\u0435\u043d\u0438\u043d\u0430'
                    self.setGeometry(300, 300, 280, 170)
                    self.setWindowTitle('Draw text')
                    self.show()
                def paintEvent(self, event):
                    qp = QtGui.QPainter()
                    qp.begin(self)
                    self.drawText(event, qp)
                    qp.end()
                def drawText(self, event, qp):
                    qp.setPen(QtGui.QColor(168, 34, 3))
                    qp.setFont(QtGui.QFont('Decorative', 10))
                    qp.drawText(event.rect(), QtCore.Qt.AlignCenter, self.text)
            def main():
                app = QtGui.QApplication(sys.argv)
                ex = Example()
                sys.exit(app.exec_())
            if __name__ == '__main__':
                main()
            

            在這里,我們繪制了一些 Azbuka 文字。這段文本垂直和水平上都對(duì)齊了。

            def paintEvent(self, event):

            繪制在 paint 事件中完成。

            qp = QtGui.QPainter()
            qp.begin(self)
            self.drawText(event, qp)
            qp.end()
            

            QtGui.QPainter 類(lèi)可用于底層的繪制。所有繪制的方法要處于 begin()end() 之間。真正的繪制委托給了 drawText() 方法。

            qp.setPen(QtGui.QColor(168, 34, 3))
            qp.setFont(QtGui.QFont('Decorative', 10))
            

            這里我們定義了畫(huà)筆及字體。

            qp.drawText(event.rect(), QtCore.Qt.AlignCenter, self.text)
            

            drawText() 方法就把文本繪制到窗口上了。 rect() 方法返回所需的矩形。

            繪制點(diǎn)

            一個(gè)點(diǎn)是最簡(jiǎn)單的圖形對(duì)象。在窗口上它就是小圓點(diǎn)。

            #!/usr/bin/python
            # -*- coding: utf-8 -*-
            """
            ZetCode PyQt4 tutorial
            In the example, we draw randomly 1000 red points
            on the window.
            author: Jan Bodnar
            website: zetcode.com
            last edited: September 2011
            """
            import sys, random
            from PyQt4 import QtGui, QtCore
            class Example(QtGui.QWidget):
                def __init__(self):
                    super(Example, self).__init__()
                    self.initUI()
                def initUI(self):
                    self.setGeometry(300, 300, 280, 170)
                    self.setWindowTitle('Points')
                    self.show()
                def paintEvent(self, e):
                    qp = QtGui.QPainter()
                    qp.begin(self)
                    self.drawPoints(qp)
                    qp.end()
                def drawPoints(self, qp):
                    qp.setPen(QtCore.Qt.red)
                    size = self.size()
                    for i in range(1000):
                        x = random.randint(1, size.width()-1)
                        y = random.randint(1, size.height()-1)
                        qp.drawPoint(x, y)
            def main():
                app = QtGui.QApplication(sys.argv)
                ex = Example()
                sys.exit(app.exec_())
            if __name__ == '__main__':
                main()
            

            這個(gè)例子中,我們隨機(jī)畫(huà)了 1000 個(gè)紅點(diǎn)。

            qp.setPen(QtCore.Qt.red)
            

            這里設(shè)置了紅色的畫(huà)筆。我們使用預(yù)定義的顏色常量。

            size = self.size()
            

            每次我們重新調(diào)整了窗口,一個(gè)繪圖信號(hào)就被生成。我們通過(guò)窗口的 size() 方法獲取當(dāng)前的大小。我們使用這個(gè)大小繪制點(diǎn)的分布。

            qp.drawPoint(x, y)
            

            我們使用 drawPoint() 繪制了點(diǎn)。

            顏色

            一個(gè)顏色對(duì)象代表紅色,綠色和藍(lán)色(RGB)的混合。合法的 RGB 值范圍在 0 到 255 。我們可以以多種方式定義顏色。最常見(jiàn)的就是使用 RGB 十進(jìn)制或十六進(jìn)制。我們也可以使用 RGBA 值,分別代表 Red,Green,Blue,Alpha。這里額外的信息表示透明度。Alpha值255定義為完全不透明,0 代表完全透明。

            #!/usr/bin/python
            # -*- coding: utf-8 -*-
            """
            ZetCode PyQt4 tutorial
            This example draws three rectangles in three
            different colors.
            author: Jan Bodnar
            website: zetcode.com
            last edited: September 2011
            """
            import sys
            from PyQt4 import QtGui, QtCore
            class Example(QtGui.QWidget):
                def __init__(self):
                    super(Example, self).__init__()
                    self.initUI()
                def initUI(self):
                    self.setGeometry(300, 300, 350, 100)
                    self.setWindowTitle('Colors')
                    self.show()
                def paintEvent(self, e):
                    qp = QtGui.QPainter()
                    qp.begin(self)
                    self.drawRectangles(qp)
                    qp.end()
                def drawRectangles(self, qp):
                    color = QtGui.QColor(0, 0, 0)
                    color.setNamedColor('#d4d4d4')
                    qp.setPen(color)
                    qp.setBrush(QtGui.QColor(200, 0, 0))
                    qp.drawRect(10, 15, 90, 60)
                    qp.setBrush(QtGui.QColor(255, 80, 0, 160))
                    qp.drawRect(130, 15, 90, 60)
                    qp.setBrush(QtGui.QColor(25, 0, 90, 200))
                    qp.drawRect(250, 15, 90, 60)
            def main():
                app = QtGui.QApplication(sys.argv)
                ex = Example()
                sys.exit(app.exec_())
            if __name__ == '__main__':
                main()
            

            在我們的例子里,我們畫(huà)了三個(gè)帶色的矩形。

            color = QtGui.QColor(0, 0, 0)
            color.setNamedColor('#d4d4d4')
            

            這里我們定義了使用十六進(jìn)制的顏色。

            qp.setBrush(QtGui.QColor(200, 0, 0))
            qp.drawRect(10, 15, 90, 60)
            

            我們定義了一把刷子和畫(huà)了一個(gè)矩形。一把刷子是一個(gè)圖像對(duì)象,用于畫(huà)形狀的背景。 drawRect() 方法接受四個(gè)參數(shù),第一二個(gè)為 x 和 y 值,第三四個(gè)是矩形的寬度和高度。這個(gè)方法用當(dāng)前的畫(huà)筆和刷子畫(huà)了一個(gè)矩形。

            QtGui.QPen

            QtGui.QPen 是一個(gè)圖像對(duì)象。主要用于畫(huà)線,曲線,以及矩形,橢圓,多邊形或其他形狀的外形。

            #!/usr/bin/python
            # -*- coding: utf-8 -*-
            """
            ZetCode PyQt4 tutorial
            In this example we draw 6 lines using
            different pen styles.
            author: Jan Bodnar
            website: zetcode.com
            last edited: September 2011
            """
            import sys
            from PyQt4 import QtGui, QtCore
            class Example(QtGui.QWidget):
                def __init__(self):
                    super(Example, self).__init__()
                    self.initUI()
                def initUI(self):
                    self.setGeometry(300, 300, 280, 270)
                    self.setWindowTitle('Pen styles')
                    self.show()
                def paintEvent(self, e):
                    qp = QtGui.QPainter()
                    qp.begin(self)
                    self.drawLines(qp)
                    qp.end()
                def drawLines(self, qp):
                    pen = QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine)
                    qp.setPen(pen)
                    qp.drawLine(20, 40, 250, 40)
                    pen.setStyle(QtCore.Qt.DashLine)
                    qp.setPen(pen)
                    qp.drawLine(20, 80, 250, 80)
                    pen.setStyle(QtCore.Qt.DashDotLine)
                    qp.setPen(pen)
                    qp.drawLine(20, 120, 250, 120)
                    pen.setStyle(QtCore.Qt.DotLine)
                    qp.setPen(pen)
                    qp.drawLine(20, 160, 250, 160)
                    pen.setStyle(QtCore.Qt.DashDotDotLine)
                    qp.setPen(pen)
                    qp.drawLine(20, 200, 250, 200)
                    pen.setStyle(QtCore.Qt.CustomDashLine)
                    pen.setDashPattern([1, 4, 5, 4])
                    qp.setPen(pen)
                    qp.drawLine(20, 240, 250, 240)
            def main():
                app = QtGui.QApplication(sys.argv)
                ex = Example()
                sys.exit(app.exec_())
            if __name__ == '__main__':
                main()
            

            在此處,我們畫(huà)了六條線。這些線以六種不同的樣式繪制。五種是預(yù)先定義的。最后一條線是自定義的。

            pen = QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine)
            

            我們創(chuàng)建了一個(gè) QtGui.QPen 對(duì)象。它的顏色是黑色的,其寬度設(shè)為兩個(gè)像素。所以我們可以看到筆之間的區(qū)別。 QtCore.Qt.SolidLine 是一種預(yù)定義的樣式。

            pen.setStyle(QtCore.Qt.CustomDashLine)
            pen.setDashPattern([1, 4, 5, 4])
            qp.setPen(pen)
            

            這里我們定義了筆的自定義樣式。我們?cè)O(shè)置為 QtCore.Qt.CustomDashLine 樣式,并調(diào)用了 setDashPattern() 方法。這個(gè)有數(shù)字的列表定義了樣式。列表的長(zhǎng)度必須是偶數(shù)。奇數(shù)位定義了劃線,而偶數(shù)則是空白。數(shù)字越大,那么它們就越大。我們這里是 1px 劃線 4px 空白 5px 劃線 4px 空白。

            QtGui.QBrush

            QtGui.QBrush 是一個(gè)圖像對(duì)象。它用于繪制圖像形狀的背景,比如矩形,橢圓,或多邊形。刷子可以有三種不同的形狀。

            #!/usr/bin/python
            # -*- coding: utf-8 -*-
            """
            ZetCode PyQt4 tutorial
            This example draws 9 rectangles in different
            brush styles.
            author: Jan Bodnar
            website: zetcode.com
            last edited: September 2011
            """
            import sys
            from PyQt4 import QtGui, QtCore
            class Example(QtGui.QWidget):
                def __init__(self):
                    super(Example, self).__init__()
                    self.initUI()
                def initUI(self):
                    self.setGeometry(300, 300, 355, 280)
                    self.setWindowTitle('Brushes')
                    self.show()
                def paintEvent(self, e):
                    qp = QtGui.QPainter()
                    qp.begin(self)
                    self.drawBrushes(qp)
                    qp.end()
                def drawBrushes(self, qp):
                    brush = QtGui.QBrush(QtCore.Qt.SolidPattern)
                    qp.setBrush(brush)
                    qp.drawRect(10, 15, 90, 60)
                    brush.setStyle(QtCore.Qt.Dense1Pattern)
                    qp.setBrush(brush)
                    qp.drawRect(130, 15, 90, 60)
                    brush.setStyle(QtCore.Qt.Dense2Pattern)
                    qp.setBrush(brush)
                    qp.drawRect(250, 15, 90, 60)
                    brush.setStyle(QtCore.Qt.Dense3Pattern)
                    qp.setBrush(brush)
                    qp.drawRect(10, 105, 90, 60)
                    brush.setStyle(QtCore.Qt.DiagCrossPattern)
                    qp.setBrush(brush)
                    qp.drawRect(10, 105, 90, 60)
                    brush.setStyle(QtCore.Qt.Dense5Pattern)
                    qp.setBrush(brush)
                    qp.drawRect(130, 105, 90, 60)
                    brush.setStyle(QtCore.Qt.Dense6Pattern)
                    qp.setBrush(brush)
                    qp.drawRect(250, 105, 90, 60)
                    brush.setStyle(QtCore.Qt.HorPattern)
                    qp.setBrush(brush)
                    qp.drawRect(10, 195, 90, 60)
                    brush.setStyle(QtCore.Qt.VerPattern)
                    qp.setBrush(brush)
                    qp.drawRect(130, 195, 90, 60)
                    brush.setStyle(QtCore.Qt.BDiagPattern)
                    qp.setBrush(brush)
                    qp.drawRect(250, 195, 90, 60)
            def main():
                app = QtGui.QApplication(sys.argv)
                ex = Example()
                sys.exit(app.exec_())
            if __name__ == '__main__':
                main()
            

            在這里,我們畫(huà)了九個(gè)不同的矩形。

            brush = QtGui.QBrush(QtCore.Qt.SolidPattern)
            qp.setBrush(brush)
            qp.drawRect(10, 15, 90, 60)
            

            我們定義了一個(gè)刷子對(duì)象,并設(shè)置給 painter 對(duì)象。然后通過(guò) drawRect() 方法畫(huà)了矩形。


            本部分,討論了基本的畫(huà)圖。

            posted on 2012-02-12 10:16 mirguest 閱讀(8553) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): Python

            評(píng)論

            # re: [Python][PyQt4]在 PyQt4 中繪圖  回復(fù)  更多評(píng)論   

            寫(xiě)得很好樓主!很適合我這種小白。。
            國(guó)內(nèi)pyqt的例子太少了。。
            我想問(wèn)一下如何將特定的事件消息比如按下按鈕的消息映射到paintEvent里面?可以給個(gè)例子嗎?
            2013-06-22 19:53 | jiuyungchaan

            # re: [Python][PyQt4]在 PyQt4 中繪圖  回復(fù)  更多評(píng)論   

            博主知道怎么寫(xiě)鼠標(biāo)繪圖事件嗎
            2015-11-18 21:58 | 張?chǎng)╈o
            国内精品久久久久| 久久精品国产99国产精品| 伊人久久大香线蕉综合Av| 日本人妻丰满熟妇久久久久久| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 精品久久久久久中文字幕大豆网| 综合久久国产九一剧情麻豆| 国内精品久久久久影院日本| 久久精品国产精品青草app| 热久久这里只有精品| 日韩亚洲国产综合久久久| 伊人久久大香线蕉av不卡| 大伊人青草狠狠久久| 欧美午夜精品久久久久久浪潮| 亚洲精品乱码久久久久久蜜桃图片 | 一本色道久久综合亚洲精品| 九九久久99综合一区二区| 女同久久| 国产精品久久亚洲不卡动漫| 久久久无码精品亚洲日韩软件| 无码精品久久久久久人妻中字| 国产精品免费久久久久影院 | 久久精品亚洲乱码伦伦中文| 综合久久一区二区三区 | 成人综合久久精品色婷婷| 国产精品久久久久影院色| 久久婷婷是五月综合色狠狠| 青青草国产精品久久| 一本久久知道综合久久| 久久久人妻精品无码一区| 久久精品国产亚洲欧美| 亚洲国产精品无码久久久秋霞2| 久久精品国产一区二区| 国产精品久久久久无码av| 少妇无套内谢久久久久| 久久WWW免费人成—看片| 久久免费美女视频| 国内精品久久久久影院优| 久久中文字幕人妻熟av女| 欧美久久亚洲精品| 久久91这里精品国产2020|