Hi
I am developing PyQt app now, and I very often have crashes, connected with
QString usage. There are 2 reasons for exceptions:
- QString contains unicode characters
- python method called for Qt string. Sometimes called somewhere deep in
3rdparty code, such as os.path.blabla(QString))
See code examples at the end
It is easy to forget about QString conversions, because there are a few
different cases:
- if you define string in Python code - it is Python string
- if you take it from PyQt4 - it is QString
- If you passed Python string through signal-slot - it becomes QString.
The majority of methods may be called with either Python and Qt strings and
work fine.
Some bugs are not reproduced, while you use ascii, but, are reproduced, when
your user uses unicode
Too difficult, too lot of problems
QString problem wad discussed there:
http://thread.gmane.org/gmane.comp.python.pyqt-pykde/4037/
Now, when PyQt4 is widely used, it maybe to late to drop QString, because
some people use QString::endsWith(), and, probably, other compatibility
problem way happen.
But, maybe it is possible to renew this discussion and create something like
hybrid object, which is Python unicode string, but, has endsWith method (and
others, if there are API differences), so may pretend to be a QString
Code examples:
Problem 1:
In [1]: from PyQt4.QtCore import QString
In [2]: print QString('hello')
hello
In [3]: print QString('привет') # Cyrillic symbols here
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
/home/a/code/mbox/core/src/lin/libonvif/<ipython console> in <module>()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11:
ordinal not in range(128)
Problem 2:
In [1]: from PyQt4.QtGui import QApplication, QFileDialog
In [2]: a = QApplication([])
In [3]: path = QFileDialog.getOpenFileName()
In [4]: path
Out[4]:
PyQt4.QtCore.QString(u'/home/a/code/mbox/core/src/lin/libonvif/Makefile')
In [5]: import os.path
In [6]: os.path.basename(path)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/a/code/mbox/core/src/lin/libonvif/<ipython console> in <module>()
/usr/lib/python2.7/posixpath.pyc in basename(p)
110 def basename(p):
111 """Returns the final component of a pathname"""
--> 112 i = p.rfind('/') + 1
113 return p[i:]
114
AttributeError: 'QString' object has no attribute 'rfind'
Best Regards,
Andrei Kopats,
https://github.com/hlamer/mksv3
opensubscriber is not affiliated with the authors of this message nor responsible for its content.