Q:

Signals And Slots: When simple example is not working

There are two widgets: the button and the label.
When the button is pressed I want to run the label's myFunction() method.
How to achieve this using signals and slots? The example below does not work. 
from PyQt import QtCore, QtGui

class label(QtGui.QLabel):
    def __init__(self, parent=None):
        super(label, self).__init__(parent) 
        self.show()

    def myFunction(self, arg=None):
        print '...myFunction: received arg =', arg

class button(QtGui.QPushButton):
    def __init__(self, parent=None):
        super(button, self).__init__(parent) 
        self.clicked.connect(self.click)
        self.show()

    def click(self):
        print 'emitted'
        self.emit(QtCore.SIGNAL('buttonClicked'))

lbl = label()
btn = button()

A:

Approach 1
One solution is to use a globally declared QObject variable connector. We use the connector.signal for both: to emit the signal and to connect the method to be executed on signal.emit().
To emit from first widget: connector.signal.emit()
To connect to second widget's method: connector.signal.connect(self.myFunction)
from PySide import QtCore, QtGui

class Communicate(QtCore.QObject):
    signal = QtCore.Signal(str)

connector=Communicate()

class label(QtGui.QLabel):
    def __init__(self, parent=None):
        super(label, self).__init__(parent) 
        connector.signal.connect(self.labelFunction)
        self.show()

    def labelFunction(self, arg=None):
        print '...labelFunction: arg =', arg

class button(QtGui.QPushButton):
    def __init__(self, parent=None):
        super(button, self).__init__(parent) 
        self.clicked.connect(self.click)
        self.show()

    def click(self):
        connector.signal.emit("Hello World")

lbl = label()
btn = button()

Approach 2
We can achieve the same functionality by passing label.labelFunction as a callback argument. The button's connector is to be connected to it:
from PySide import QtCore, QtGui

class Communicate(QtCore.QObject):
    signal = QtCore.Signal(str)

class label(QtGui.QLabel):
    def __init__(self, parent=None):
        super(label, self).__init__(parent) 
        self.show()

    def labelFunction(self, arg=None):
        print '...labelFunction: arg = %s'%arg

class button(QtGui.QPushButton):
    def __init__(self, callback=None, parent=None):
        super(button, self).__init__(parent) 
        self.callback=callback
        self.clicked.connect(self.click)
        self.show()

    def click(self):
        connector=Communicate()
        connector.signal.connect(self.callback)
        connector.signal.emit("Hello World")

lbl = label()
btn = button(callback=lbl.labelFunction)

Approach 3
Just like previously we still emit on button.clicked.
But a different syntax is used to connect label to the customSignal:
self.connect(btn, QtCore.SIGNAL('customSignal'), Function)
from PySide import QtCore, QtGui

def Function(arg=None):
    print 'Function.arg: %r'%arg

class button(QtGui.QPushButton):
    def __init__(self, parent=None):
        super(button, self).__init__(parent) 
        self.clicked.connect(self.click)
        self.show()

    def click(self):
        self.emit(QtCore.SIGNAL('customSignal'), 'String Arument')

btn = button()

class label(QtGui.QLabel):
    def __init__(self, parent=None):
        super(label, self).__init__(parent) 
        self.connect(btn, QtCore.SIGNAL('customSignal'), Function) 
        self.show()   

lbl = label()

