Houdini 20.0 サンプル Pythonパネルのサンプル

Qtイベント

Python PanelsからQtイベントをリッスンする方法。

Example

このサンプルでは、以下のイベントをハンドルします:

Resize

ウィジェットサイズが変わった時、例えば、ペインタブのサイズを変更した時にトリガーされます。

MouseMove

カーソルが移動し、そのウィジェットに対してsetMouseTrackingがコールされた時にトリガーされます。

EnterとLeave

ウィジェット内にカーソルが入ったり出た時にトリガーされます。

Paint

ウィジェットを再描画するべき時にトリガーされます。

このサンプルでは、ResizeとMouseMoveを使用して位置とサイズを追跡し、Enter/Leaveを使用してフォーカスの状態を追跡しています。 Paintがコールされた時に、その位置とサイズをカーソルの横に表示します。 フォーカスの状態を使用して、背景カラーを選択します。

<?xml version="1.0" encoding="UTF-8"?>
<pythonPanelDocument>
  <!-- This file contains definitions of Python interfaces and the
 interfaces menu.  It should not be hand-edited when it is being
 used by the application.  Note, that two definitions of the
 same interface or of the interfaces menu are not allowed
 in a single file. -->
  <interface name="EventExample" label="Qt Event Example" icon="SOP_drawcurve">
    <script><![CDATA[import math
import os
import sys

from hutil.Qt import QtCore, QtGui, QtWidgets

panel_path = "%s/houdini/help/examples/python_panels/" % os.environ["HFS"]
sys.path.append(panel_path)

from examplehelp import ExampleHelpWidget

class QtEventExample(QtWidgets.QWidget):
    def __init__(self, paneTab):
        QtWidgets.QWidget.__init__(self)

        self.paneTab = paneTab

        # Mouse tracking must be enabled to receive mouse move events
        self.setMouseTracking(True)

        self.mouseX = 0
        self.mouseY = 0
        self.sizeX = 0
        self.sizeY = 0
        self.factor = 100

        self.fullHelpString = """This example demonstrates how Python Panels can listen to Qt events. 
                The following events are handled:<br><br>
                  * <b>Resize</b> - Triggered when the widget size changes, e.g. resizing the pane tab.<br>
                  * <b>MouseMove</b> - Triggered when the cursor moves and `setMouseTracking` is called on the widget.<br>
                  * <b>Enter</b> and <b>Leave</b> - Triggered when the cursor enters or leaves the widget.<br>
                  * <b>Paint</b> - Triggered when the widget should redraw.<br><br>
                In this example, Resize and MouseMove are used to track position and size, and Enter/Leave are used 
                to track focus state. When Paint is called the position and size are displayed beside the cursor. The 
                focus state is used to select a background color."""
        self.smallHelpString = """This example demonstrates how Python Panels can listen to Qt events. 
                Click <b>Show More</b> for more details...""" 
        self.helpWidget = ExampleHelpWidget(self.smallHelpString, self.fullHelpString)

        layout = QtWidgets.QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

        layout.addWidget(self.helpWidget, 1, QtCore.Qt.AlignTop)

    # This method is called immediately before the widget is shown
    def showEvent(self, event):
        try:
            # Try to set the pane tab label for the widget. A try/catch
            # is needed since the pane tab type may be changed elsewhere
            pane = self.paneTab
            pane.setLabel("(Shown) Qt Event Example")
        except:
            pass

    # This method is called after the widget is hidden
    def hideEvent(self, event):
        try:
            # Try to set the pane tab label for the widget. A try/catch
            # is needed since the pane tab type may be changed elsewhere
            pane = self.paneTab
            pane.setLabel("(Hidden) Qt Event Example")
        except:
            pass

    # Called when the widget's dimensions change
    def resizeEvent(self, event):
        # Store the new size so it can be drawn to the screen later on
        self.sizeX = event.size().width()
        self.sizeY = event.size().height()
        self.repaint()

    # Called when the mouse cursor moves around inside the widget boundaries
    def mouseMoveEvent(self, event):
        # Store mouse coordinates so they can be drawn to the screen 
        self.mouseX = event.x()
        self.mouseY = event.y()
        self.repaint()

    # Called when the cursor enters the outer bounds of the widget
    def enterEvent(self, event):
        # self.factor controls background brightness - 120 is bright
        self.factor = 100
        self.repaint()

    # Called when the cursor leaves the outer bounds of the widget
    def leaveEvent(self, event):
        # self.factor controls background brightness - 80 is dark
        self.factor = 80
        self.repaint()

    # Called when the widget needs to repaint its contents
    def paintEvent(self, event):
        # Construct a painter from the widget and fill a background color
        painter = QtGui.QPainter(self)
        color = QtGui.QColor(self.factor*0.55, self.factor*0.7, self.factor * 0.8)
        painter.fillRect(0, 0, self.width(), self.height(), color)

        # If the mouse is inside the widget, render the size and position next to the cursor
        if self.factor > 80:
            pos_string = "Mouse Position: [" + str(self.mouseX) + "," + str(self.mouseY) + "]"
            size_string = "Panel Size: [" + str(self.sizeX) + "," + str(self.sizeY) + "]"
            painter.drawText(self.mouseX + 20, self.mouseY + 5, pos_string)
            painter.drawText(self.mouseX + 20, self.mouseY + 18, size_string)

def onCreateInterface():
    example = QtEventExample(kwargs['paneTab'])
    return example

]]></script>
  </interface>
</pythonPanelDocument>

Pythonパネルのサンプル

  • Custom Graphics

    Python Panelでの独自のOpenGL描画。

  • Qt Designer

    Qt Designerファイルからユーザインターフェースレイアウと読み込む方法。

  • Qtイベント

    Python PanelsからQtイベントをリッスンする方法。

  • Viewport Color Editor

    ビューポートのカラーを編集するためのPySideインターフェース。

  • ドラッグアンドドロップ

    Python Panelでドラッグアンドドロップの機能を実装する方法。

  • ノードパス

    現行ノードパスの変更を検知する方法。

  • パラメータのリンク

    PySideパラメータウィジェット(つまり、テキストフィールドとスライダ)をHoudiniのノードパラメータへリンク、またはその逆のリンクの付け方。