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>