| Example |
This example handles the following events:
Resize
Triggered when the widget size changes, e.g. resizing the pane tab.
MouseMove
Triggered when the cursor moves and setMouseTracking is called on the widget.
Enter and Leave
Triggered when the cursor enters or leaves the widget.
Paint
Triggered when the widget should redraw.
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.
<?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>