[PyQt] How to use QHash in PyQt?

Phil Thompson phil at riverbankcomputing.com
Wed Feb 3 12:59:35 GMT 2010

On Wed, 3 Feb 2010 19:24:28 +0800 (CST), donglongchao
<donglongchao at 163.com>
> 在2010-02-03 17:41:17,"Phil Thompson" <phil at riverbankcomputing.com>
> 写道: >On Wed, 3 Feb 2010 10:31:44 +0800 (CST), donglongchao
>><donglongchao at 163.com> >wrote: >> Hi,all >>  >> I am newbie to PyQt and I
> have a question when I work on my app with >PyQt. >> I want to use a
> QDataStream to form a QHash object into a QByteArray and >> write it into
> QTcpSocket.But there is an error when I run my app said  >> NameError:
> global name 'QHash' is not defined.I have import everything >from >>
> and QtGui.Also I can locate qhash.sip in my computer >>
> (/usr/share/sip/PyQt4/QtCore/qhash.sip).So I want to know wherer is the
> problem and how to use QHash here. > >In C++ QHash is a template. For the
> classes that Qt provides a qHash() >implementation, PyQt implements the
> __hash__ method so that hash() returns >the value that qHash() returns.
> But I still do not know how to create an object like QHash<int,QString>.I
> checked the file qhash.sip and find that 
>  QHash<TYPE1, TYPE2> is implemented as a Python dictionary.So is it
>  possible to convert a dict object into a QHash<TYPE1,TYPE2> object?

No, because templates are instantiated at compile-time not run-time.

> Because
>  I can not use a dict object with QDataStream's operator "<<" directly.

You can read and write the dict items individually.

Alternatively (if the dict can be pickled) you can use
QDataStream.writeQVariant(). The dict will be converted to a QVariant
automatically. Use QDataStream.readQVariant() to read it back and
QVariant.toPyObject() to get the dict from the QVariant.


More information about the PyQt mailing list