PyQt in Maya examples

288 views
Skip to first unread message

floyd1510

unread,
Sep 29, 2009, 1:42:02 AM9/29/09
to python_inside_maya
Hello all,

I have got PyQt up and running in Maya 2009. I was wondering if
someone could guide me to a few examples, like adding a list of
objects from maya into the QT listview or adding items dynamically to
a combo box etc.

I appreciate the help.

Cheers,
Vikram.

David Moulder

unread,
Sep 29, 2009, 5:24:45 AM9/29/09
to python_in...@googlegroups.com
Ok,  Here's and basic example with PyQT and a QListWidget...
Please note.  This use's a modified pumpThread module.  The default one from the maya dev kit has given us lots of problems.
Thanks to some very clever people on this list we now have a working pumpThread module that is heavily tested here at work.

from PyQt4 import QtCore, QtGui
import pymel as pm
import pumpThread

class ExampleUI(QtGui.QDialog):
    def __init__(self, parent=None):
        super(ExampleUI, self).__init__(parent)
        # Set some basic properties on the UI
        self.setWindowTitle('ExampleUI')
        self.setObjectName("ExampleUI")
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

    # Add a Layout and set it to the UI
        self.mainLayout = QtGui.QVBoxLayout(self)
        self.setLayout(self.mainLayout)
       
        # Add a Button and set some properties.  Also add it to a layout.
        self.RefreshButton = QtGui.QPushButton()
        self.RefreshButton.setText("Refresh")
        self.mainLayout.addWidget(self.RefreshButton)

        # Add a list and set it to the layout
        self.SelectionList = QtGui.QListWidget()
        self.SelectionList.setMinimumSize(250,250)
        self.mainLayout.addWidget(self.SelectionList)

        # Connect the Refresh Button to a function to populate the list using SIGNAL's
        self.connect(self.RefreshButton, QtCore.SIGNAL("clicked()"), self._RefreshButtonFunc)

    def _RefreshButtonFunc(self):
        '''
        Fill the list based on a maya selection
        '''
        oSel = pm.selected()
        if oSel:
            self.SelectionList.clear()
            [self.SelectionList.addItem(s.name()) for s in oSel]
        else:
            self.SelectionList.clear()

    @staticmethod
    def Display():
        '''
        calls the window.  Typical PumpThread call
        Use's a modified pumpThread that properly set's up the thread.
        '''
        # We need a global to stop python gc the UI
        global mainWindow

        # We need pumpThread to make the UI responsive
        pumpThread.initializePumpThread()
        app = pumpThread.get_app()
        if app:
            # We can set the app to use a nice style
            app.setStyle('Plastique')
            mainWindow = ExampleUI()
            mainWindow.show()

ExampleUI.Display()

I'll post our final pumpThread later today.

-Dave

floyd1510

unread,
Sep 30, 2009, 12:53:28 AM9/30/09
to python_inside_maya
Thanks Dave for the example.

The problem is that I couldn't get the example running. Following is
what I executed in Maya :

import example
example.ExampleUI()

This outputs the following :

# Result: <example.ExampleUI object at 0x2268B6A8> #

Then on running :

ExampleUI.Display() , I get an error saying ExampleUI is not defined.

Any idea where am I going wrong. Thanks for the help,

Cheers,
Vikram.



This gives an error saying that ExampleUI is not defined. What am I
doing wrong

Chad Dombrova

unread,
Sep 30, 2009, 1:59:01 AM9/30/09
to python_in...@googlegroups.com
try:

example.ExampleUI.Display()

ExampleUI is inside the example module, so you have to prefix it with
the module name

-chad

Sylvain Berger

unread,
Oct 23, 2009, 4:41:53 PM10/23/09
to python_in...@googlegroups.com
Where can I find your version of pumpThread?

Thanks
--
"A pit would not be complete without a Freeman coming out of it."
The Vortigaunt

David Moulder

unread,
Oct 26, 2009, 5:23:34 AM10/26/09
to python_in...@googlegroups.com
Here it is...., This version has fixed our threading errors that occurred where maya wouldn't close correctly and leave 1 mayapy thread open.

-Dave

###########################


from PyQt4 import QtCore, QtGui
import maya.utils as utils
import sys
import time
import threading
import maya.cmds as cmds

pumpedThread = None
app = None
gPump = True

def get_app():
    global app
    return app

def set_app(i_app):
    global app
    testAppInstance = QtCore.QCoreApplication.instance()
    if testAppInstance:
        app = testAppInstance
    else:
        app = i_app

def get_pt():
    global pumpedThread
    return pumpedThread

def set_pt(i_pt):
    global pumpedThread
    pumpedThread = i_pt
       
def pumpQt():
    global app
    global gPump
    processorEv = threading.Event()
    def processor():
        app.processEvents()
        processorEv.set()
    while gPump:
        utils.executeDeferred( processor )
        processorEv.wait()
        processorEv.clear()
        time.sleep(0.01)
       
def killProcess():
    global gPump
    gPump = False
       
def killPumpThread():
    if get_app():
        get_app().closeAllWindows()
    if get_pt():
        while get_pt().isAlive():
            killProcess()
        set_pt(None)
        set_app(None)
       

def initializePumpThread():
    global gPump
    gPump = True
        if get_pt() == None:
                set_app(QtGui.QApplication(sys.argv))
                set_pt(threading.Thread( target = pumpQt, args = () ))
                get_pt().start()

Sylvain Berger

unread,
Oct 26, 2009, 9:13:08 AM10/26/09
to python_in...@googlegroups.com
Thanks a lot David!

John Creson

unread,
Oct 26, 2009, 3:19:51 PM10/26/09
to python_in...@googlegroups.com
Thanks David!
Reply all
Reply to author
Forward
0 new messages