Bytearray swig pyqt Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mantus
User
Beiträge: 17
Registriert: Freitag 4. Dezember 2009, 09:08

Hi

ich hab mit swig eine c function gewrapped die ~ so aussieht

func(char const *, uint8, char const *, uint 8)

2 strings mit länge.
da char const * oft in der gesammten api als bytepuffer benutzt werden habe ich "char const *" als bytearrays gewrappt.

das problem ist jetzt nur das es mit PyQT zusammen nicht will :/

wenn ich von einem QLineEdit mit text() einen QString bekomme, und diesen dann der Funktion übergeben will, beschwert sich diese das sie den typ nicht kennt.

Code: Alles auswählen

TypeError: in method 'func', argument 1 of type 'char const *'
so jetzt is die Frage, wie mache ich aus einem QString ein Bytearray sodas es wieder geht?
und wieso mach python aus "xxx" ein bytearray, aber aus einen QString oder QString.__str__() kein bytearray?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

mit QT kenne ich mich leider (immer noch nicht) aus. Aber magst Du vielleicht Deine Frage nochmal stellen? In ganzen Sätzen und den relevanten Code (am besten in einem Pastebin ausgelagert) zeigen? Dann wirst Du hier *vielleicht* Hilfe finden.

Gruß,
Christian
BlackJack

@mantus: "Python" macht aus "xxx" kein Bytearray, sondern `ctypes` tut das. Und zwar weil die `ctypes`-Autoren Python's Standard-Typ `str` kennen und wissen das der im allgemeinen in C als Array von ``char``\s verwendet wird. Es wird dort nicht einfach die `__str__()`-Methode von beliebigen Objekten aufgerufen und das was da heraus kommt verwendet, denn so eine Methode hat *jedes* Objekt und nur in verhältnismässig sehr wenigen Fällen macht es Sinn *das* an C-APIs zu übergeben.

`QString` ist übrigens Unicode, da würde ich sowieso lieber explizit dafür sorgen, dass die Zeichenkette, die ich an C übergebe in der richtigen Kodierung vorliegt.
Antworten