I - PySide example usage
RV ships with PySide on all platforms. In this section, we present two simple examples of PySide usage. We also demonstrate how to access the RV session window in the second example.
The first example, shown below, is a simple executable python/pyside file that uses RV py-interp.
#!/Applications/RV64.app/Contents/MacOS/py-interp
# Import PySide classes
import sys
from PySide.QtCore import *
from PySide.QtGui import *
# Create a Qt application.
# IMPORTANT: RV's py-interp contains an instance of QApplication;
# so always check if an instance already exists.
app = QApplication.instance()
if app == None:
app = QApplication(sys.argv)
# Display the file path of the app.
print app.applicationFilePath()
# Create a Label and show it.
label = QLabel("Using RV's PySide")
label.show()
# Enter Qt application main loop.
app.exec_()
sys.exit()
The second example, shown below, is a RV python package that uses pyside for building its UI with Qt widgets that control properties values on an RVLensWarp node. Note too that in this example, the current RV session QMainWindow obtained from rv.qtutils.sessionWindow() and we use it to change the session window’s opacity with the “Enable” checkbox.
This “PySide Example” can be loaded in RV through Preferences->Packages.
from PySide.QtCore import QFile
from PySide.QtGui import QDoubleSpinBox, QDial, QCheckBox
from PySide.QtUiTools import QUiLoader
import types
import os
import math
import rv
import rv.qtutils
import pyside_example # need to get at the module itself
class PySideDockTest(rv.rvtypes.MinorMode):
"A python mode example that uses PySide"
def checkBoxPressed(self, checkbox, prop):
def F():
try:
if checkbox.isChecked():
if self.rvSessionQObject is not None:
self.rvSessionQObject.setWindowOpacity(1.0)
rv.commands.setIntProperty(prop, [1], True)
else:
if self.rvSessionQObject is not None:
self.rvSessionQObject.setWindowOpacity(0.5)
rv.commands.setIntProperty(prop, [0], True)
except:
pass
return F
def dialChanged(self, index, last, spins, prop):
def F(value):
diff = float(value - last[index])
if diff < -180:
diff = value - last[index] + 360
elif diff > 180:
diff = value - last[index] - 360
diff /= 360.0
last[index] = float(value)
try:
p = rv.commands.getFloatProperty(prop, 0, 1231231)
p[0] += diff
if p[0] > spins[index].maximum() :
p[0] = spins[index].maximum()
if p[0] < spins[index].minimum() :
p[0] = spins[index].minimum()
spins[index].setValue(p[0])
rv.commands.setFloatProperty(prop, p, True)
except:
pass
return F
def spinChanged(self, index, spins, prop):
def F(value):
try:
rv.commands.setFloatProperty(prop, [p], True)
except:
pass
def F():
try:
p = spins[index].value()
commands.setFloatProperty(prop, [p], True)
except:
pass
return F
def findSet(self, typeObj, names):
array = []
for n in names:
array.append(self.dialog.findChild(typeObj, n))
if array[-1] == None:
print "Can't find", n
return array
def hookup(self, checkbox, spins, dials, prop, last):
checkbox.released.connect(self.checkBoxPressed(checkbox, "%s.node.active"%prop))
for i in range(0,3):
dial = dials[i]
spin = spins[i]
propName = "%s.warp.k%d" % (prop,i+1)
dial.valueChanged.connect(self.dialChanged(i, last, spins, propName))
spin.valueChanged.connect(self.spinChanged(i, spins, propName))
last[i] = dial.value()
def __init__(self):
rv.rvtypes.MinorMode.__init__(self)
self.init("pyside_example", None, None)
self.loader = QUiLoader()
uifile = QFile(os.path.join(self.supportPath(pyside_example, "pyside_example"), "control.ui"))
uifile.open(QFile.ReadOnly)
self.dialog = self.loader.load(uifile)
uifile.close()
self.enableCheckBox = self.dialog.findChild(QCheckBox, "enableCheckBox")
#
# To retrieve the current RV session window and
# use it as a Qt QMainWindow, we do the following:
self.rvSessionQObject = rv.qtutils.sessionWindow()
# have to hold refs here so they don't get deleted
self.radialDistortDials = self.findSet(QDial, ["k1Dial", "k2Dial", "k3Dial"])
self.radialDistortSpins = self.findSet(QDoubleSpinBox, ["k1SpinBox", "k2SpinBox", "k3SpinBox"])
self.lastRadialDistort = [0,0,0]
self.hookup(self.enableCheckBox, self.radialDistortSpins, self.radialDistortDials, "#RVLensWarp", self.lastRadialDistort)
def activate(self):
rv.rvtypes.MinorMode.activate(self)
self.dialog.show()
def deactivate(self):
rv.rvtypes.MinorMode.deactivate(self)
self.dialog.hide()
def createMode():
"Required to initialize the module. RV will call this function to create your mode."
return PySideDockTest()