Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the meaning of the brackets in the code line 'combo.activated[str].connect(self.onActivated)' for pyside?

Tags:

python

qt

pyside

In a pyside tutorial I see the following line in the QtGui.QComboBox example:

combo.activated[str].connect(self.onActivated)  

What does the expression [str] mean in this context? This is neither explained in the example, not on the pyside documentation. And also from the original Qt documentation it is not clear what the expression [str] actually means.

I am well aware of indexing lists and dictionaries, but in the given context it seems a class method is indexed.

like image 646
Alex Avatar asked May 24 '14 16:05

Alex


1 Answers

Here, activated is an overloaded signal, and [str] is indexing to the str-typed overload.

The signal is overloaded for the same reason a function is considered overloaded in C++: There are two functions with the same name, taking different parameters:

void QComboBox::activated ( int index ) [signal]
void QComboBox::activated ( const QString & text ) [signal]

Python doesn't have the strongly-typed function overloading that C++ has. So instead, PyQt handles this by having a dictionary of slots to which you can connect. The key to this dictionary is the type of the argument your handle will accept.

This example on the page that wastl linked to describes it well:

from PyQt4.QtGui import QComboBox

class Bar(QComboBox):

    def connect_activated(self):
        # The PyQt4 documentation will define what the default overload is.
        # In this case it is the overload with the single integer argument.
        self.activated.connect(self.handle_int)

        # For non-default overloads we have to specify which we want to
        # connect.  In this case the one with the single string argument.
        # (Note that we could also explicitly specify the default if we
        # wanted to.)
        self.activated[str].connect(self.handle_string)

    def handle_int(self, index):
        print "activated signal passed integer", index

    def handle_string(self, text):
        print "activated signal passed QString", text

Further Reading:

  • PyQt and Signal Overloads (Blogspot)
  • Connecting an overloaded PyQT signal using new-style syntax (Stack Overflow)
like image 50
Jonathon Reinhart Avatar answered Nov 07 '22 18:11

Jonathon Reinhart