Scope <or> PyQt question

David Boddie david at boddie.org.uk
Thu Jul 26 13:13:45 EDT 2007


On Thu Jul 26 18:00:44 CEST 2007, dittonamed wrote:

> On Jul 26, 10:15 pm, Stargaming <stargam... at gmail.com> wrote:

> > Answering from a non-Qt point of view (ie. I don't know if there were
> > cleaner ways using Qt stuff), you have to bind p somewhere not local to
> > the function. Any attribute of `self` (that's hopefully not used by
> > QMainWindow) should be fine.

[...]

> I was having trouble getting that to work and thought it because of
> event driven nature of gui/qt programming. But i'll give it another go
> anyway .. any examples? ;-)

from qt import *

class Form2(QMainWindow):
    def __init__(self,parent = None,name = None,fl = 0):
        QMainWindow.__init__(self,parent,name,fl)
        self.statusBar()

    def playAudio(self):
        self.p = QProcess(self, 'player')
        playcmd = '/usr/bin/play'
        filename = 'song.ogg'
        self.p.addArgument(playcmd)
        self.p.addArgument(filename)
        self.p.start()

    def stopAudio(self):
        self.p.kill()

> Im wondering what the "right" way to do this is - the Qt way, or is
> what you mentioned in fact the "right" way? Can i access the QObject
> another way or am i barking up the wrong tree?

If you store the process in the instance of Form2, you don't need to access
it via the object tree. Most Qt programs (in C++) would also use the same
approach. You _can_ access the process via the object tree, as you
discovered - it's just less convenient to do it that way.

Just to satisfy your curiosity, let's look at your code again:

  ''' #This is just to show that i can "see" the object, though i
      #dont know how to "access" it
      #the output shows the QProcess object by name...
      # but how do i reference it??
  allobjs = list(QObject.objectTrees())
  for obj in allobjs:
          objName = QObject.name(obj)
          if objName == 'Form2':
                  print QObject.children(obj)
  '''

When you obtain the Form2 instance, you could inspect its children, testing
whether each one is a QProcess object with either Python's isinstance()
function or QObject's inherits() method.

Alternatively, you could use QObject's queryList() method or the
qt_find_obj_child() function.

With PyQt4, QObject has a findChild() method to perform these kinds of
searches. Still, I'd recommend just keeping a reference to the process in
your Form2 instance.

David



More information about the Python-list mailing list