mieki256's diary



2016/10/11(火) [n年前の日記]

#1 [python] PySide勉強中

Python + PySide を使って、マウスボタンを押してドラッグするとウインドウ内に何かを描く、みたいな処理をしてみたい。

こんな感じだろうか…。

_drawing_pyside_3.py
"""
PySideでウインドウに描画。
空の QPixmap を作ってそこに描画する例。
マウス左ボタンを押して動かすとその位置に円を描画する。

参考ページ:

「プログラムでシダを描画する」をPythonで描画過程まで出力する - Qiita
http://qiita.com/tatuno/items/23d291dd3bf01693bde4

[Python][PySide] 簡単なメニュー付きウィンドウを表示する | unlinked log
http://log.noiretaya.com/?p=250

PyQtでのグラフィックス その1 (QWidgetに直接描画する) - bravo's blog
http://bravo.hatenablog.jp/entry/2016/02/07/084048
"""

import sys
from PySide.QtCore import *
from PySide.QtGui import *

width = 480
height = 360

brush_use = True
brush_filename = "ball.png"


class MyWidget(QWidget):

    """描画担当ウィジェット"""

    def __init__(self, parent):
        super(MyWidget, self).__init__(parent)
        self.mouseOnFlag = False

        # 空のQPixmapを生成。以後はここに描画していく
        self.pixmap = QPixmap(width, height)
        self.pixmap.fill()

        # ブラシ画像を読み込み
        self.brush_pixmap = QPixmap(brush_filename)

    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)
        qp.drawPixmap(0, 0, self.pixmap)
        qp.end()

    def mousePressEvent(self, event):
        """ マウスボタンを押した """
        if event.button() == Qt.LeftButton:
            self.mouseOnFlag = True
            self.mydraw(event)

    def mouseMoveEvent(self, event):
        """ マウスを動かした """
        if self.mouseOnFlag:
            self.mydraw(event)

    def mouseReleaseEvent(self, event):
        """ マウスボタンを離した """
        if event.button() == Qt.LeftButton:
            self.mouseOnFlag = False

    def mydraw(self, event):
        """ 描画処理 """
        qp = QPainter()
        qp.begin(self.pixmap)

        # マウス座標取得
        x = event.pos().x()
        y = event.pos().y()

        if brush_use:
            # ブラシ画像で描画
            x -= self.brush_pixmap.width() / 2
            y -= self.brush_pixmap.height() / 2
            qp.drawPixmap(x, y, self.brush_pixmap)
        else:
            # 円を描画
            qp.setBrush(QColor(0, 0, 128))
            qp.setPen(QColor(0, 64, 255))
            qp.drawEllipse(event.pos(), 20, 20)

            # 点を描画する例
            # qp.drawPoint(x, y)

        qp.end()
        self.repaint()


class MainWindow(QMainWindow):

    """ メインウインドウ """

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(width, height)
        # self.setFixedSize(width, height)
        # self.refresh_rate = 200

        # メニューバー作成
        menubar = QMenuBar()
        file_menu = QMenu("&File", self)
        exit_action = file_menu.addAction("&Exit")
        exit_action.setShortcut("Ctrl+Q")
        exit_action.triggered.connect(qApp.quit)
        menubar.addMenu(file_menu)
        self.setMenuBar(menubar)

        # ステータスバー作成
        self.statusBar()

        # 描画するウィジェットを作成して真ん中に配置
        widget = MyWidget(self)
        self.setCentralWidget(widget)


def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    app.setActiveWindow(window)
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
使ったブラシ画像は以下。

_ball.png

pyside_draw_ss01.gif

以上です。

過去ログ表示

Prev - 2016/10 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project