1. Page d'accueil

Python Bindings Tools For QtV4

Choses à savoir

Les Chaînes de Caractère Python , Les Chaînes de Caractère Qt et Unicode

Le support Unicode a été ajouté à Qt à la version 2.0 et à Python dans la version 1.6. Dans Qt, le support Unicode est implémenté en utilisant la classe QString. Il est important de comprendre que les instances QString, les chaînes de caractère Python et les objets Python Unicode sont totalement différent mais que les conversions entre-eux sont automatique dans la majorité des cas et qu’il est simple de les convertir manuellement lorsque nécessaire.

Lorsque PyQt attend une QString en argument de fonction, un objet chaîne de caractère Python ou un objet Unicode Python peut être fournis à la place, et PyQt fera la conversion nécessaire automatiquement.

Vous pouvez aussi convertir manuellement une chaîne de caractère Python et un objet Unicode en instance QString en utilisant le constructeur QString tel qu’exposé dans l’extrait suivant :

qs1 = QtCore.QString("Converted Python string object")
qs2 = QtCore.QString(u"Converted Python Unicode object")

De façon a convertir un QString vers un objet chaîne de caractère python utilisez la méthode native str(). Appliquer str() sur un objet QString nul et un objet QString vide résultera dans les deux cas en une chaîne de caractère Python vide.

Afin de convertir un QString vers un objet Python Unicode utilisez la méthode native Python unicode(). Appliquer unicode() sur un objet QString nul et un objet QString vide résultera dans les deux cas en une chaîne de caractère Python vide.

QString implémente aussi le protocole de mise en tampon de Python qui signifie qu’une QString peut être utilisé dans beaucoup de cas ou une chaîne de caractère Python ou un objet Unicode est attendu sans être explicitement convertis.

Garbage Collection - Ramasse miette

C++ ne récupère pas dans son ramasse miette les classes d’instances non référencées, là ou Python le fait. Dans le l’extrait de code suivent les deux couleurs existent bien que la première ne puisse plus être référencée au sein du programme :

col = new QColor();
col = new QColor();

Dans l’extrait correspondant en Python, la première couleur est détruite lorsque la deuxième est assigné à col :

col = QtGui.QColor()
col = QtGui.QColor()

En Python, chaque couleur doit être assignée à différent nom. Typiquement ceci est fait au sein de la définition de classe, ainsi l’extrait de code devrait ressembler à ce qui suit :

self.col1 = QtGui.QColor()
self.col2 = QtGui.QColor()

Parfois une instance de classe Qt maintiendra un pointeur vers une autre instance et appellera éventuellement le destructeur de cette seconde instance. L’exemple le plus courant est qu’un QObject (et de ces sous classes) garde le pointeur sur ces enfants et ira automatiquement appeler leur destructeur. Dans ces cas, l’objet Python correspondant conservera lui aussi une référence vers ces objets enfants correspondant.

Ansi, dans l’extrait Python suivant, le premier QLabel n’est pas détruit lorsque le second est assigné à lab car le QWidget parent conserver une référence vers celui-ci :

parent = QtGui.QWidget()
lab = QtGui.QLabel("First label", parent)
lab = QtGui.QLabel("Second label", parent)

Héritage Multiple

Il n’est pas possible de définir une nouvelle classe Python qui hérite de plus d’une classe Qt.

Accès aux Fonctions Membres Protégées

Lorsqu’une instance de classe C++ n’est pas créé à partir de Python il n’est pas possible d’accéder aux fonctions membres protégées, ou émettre tous signaux, de cette instance. Le tenter leverait alors une exception Python. En outre, toute méthodes Python correspondant à l’instance d’une fonction membre virtuelle ne sera jamais appelée.

None and NULL

Dans tout PyQt, la valeur None peut être spécifiée partout où NULL est accepté dans le code C++.

Également, Null est convertis en None partout ou il est renvoyé par le code C++.

Support de void *

PyQt (acuellement SIP) représente la valeur void * comme un objet de type sip.voidptr. De telles valeurs sont souvent utilisées pour passer l’adresse d’objet externe entre différents modules Python. Pour rendre cela plus simple, un entier Python (ou tout ce que python peut convertir en entier) peut être utilisé partout ou sip.voidptr est attendue.

Un sip.voidptr peut être convertis vers un entier Python en utilisant la méthode native int().

Un sip.voidprt peut être convertis vert une chaîne de caractère Python par l’utilisation de la méthode asstring(). La méthode asstring() prend un argument entier qui est la longueur des données en bytes.

super et les Classes PyQt

PyQt implémente en interne une technique paraisseuse (Lazy Technique) pour la consultation d’attributs où les attributs sont toujours placés dans des type et des dictionnaires d’instance lorsqu’ils sont référencés en premier. Cette technique est nécessaire pour réduire le temps pris par l’importation de large modules tel que PyQt.

Dans la majorité des cas cette technique est transparente pour une application. L’exception apparaît lorsque super est utilisé avec une classe PyQt. La manière dont super est aujourd’hui implémenté implique que la consulation paresseuse est outre passée. Il en résulte une exception AttributeError tant que les attributs n’ont pas été référencés auparavant.

Notez que cette restriction s’applique à toute classe enveloppée par SIP pas uniquement PyQt.

Les commentaires sont fermé pour cet élément.