2012-02-13 57 views
12

我剛剛剛學習python和Qt。所以請考慮這將是一個新手問題,但我卡在這裏。如何從QVariant獲取原始Python數據

import sys 
from PyQt4.QtCore import * 

data1 = 'string' 
data2 = QVariant(data1) 
data3 = data2.toPyObject() 

我預計data3與data1'string'是一樣的。然而,在我的系統數據3是

PyQt4.QtCore.QString(u'string') 

這不是一個大問題,如果我要處理的數據是簡單的像的例子,但我想,所以我需要解決這個問題來處理「字典」類型的數據。

我認爲這是編碼問題,但找不到如何解決它。

*在每一個文件,我宣佈:

#-*- coding: utf-8 -*- 
+2

您可以通過[設置'QString' api to 2](http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/incompatible_apis.html)來解決這個「問題」,但爲什麼你需要轉換成'QVariant'並返回? – Avaris 2012-02-13 08:38:47

回答

13

可以解決此問題由一個不變的容器包裝你的數據:

>>> from PyQt4.QtCore import QVariant 
>>> data = {'key1': 123, 'key2': 456} 
>>> v = QVariant((data,)) 
>>> v.toPyObject()[0] 
{'key2': 456, 'key1': 123} 
+0

(數據)如何使數據不可變,不僅僅是(數據)表現爲不可變或添加「,」使它成爲一個元組? – 2013-02-13 17:37:01

+3

@san。它不會使_data_不可變。如果數據放入不可變容器(如元組)中,則不會嘗試進行轉換。元組不能轉換爲等效的C++類型,所以元組及其內容將保持不變。同樣值得一提的是,以這種方式做事情會帶來性能優勢,因爲它繞過了Python和C++類型之間來回轉換的所有開銷。 – ekhumoro 2013-02-13 18:27:51

0

之前,你可以比較data1data3你需要轉換QString到Python字符串簡單地寫:

>>> same_as_data1 = str(data3) 

現在你找回相同的字符串:

>>> data1 == data 
data1 == same_as_data1 
True 

無論出現什麼字符串(作爲鍵或值),它都將映射到QString。您可以手動執行轉換,例如:

d = QVariant({'key1':123}).toPyObject() 
d_with_str_keys = dict((str(k), v) for k,v in d.iteritems()) 

,或者你可以改變QString行爲,阿瓦里斯上述指出。

+0

謝謝你的回答。是的,它適用於字符串。你能告訴我如何處理'字典'型數據? 'code' QVariant({'key1':123})。toPyObject()'code'是'code' {PyQt4.QtCore.QString(u'key1'):1234}'''我不能將它轉換爲原始字典類型數據 – 2012-02-13 08:41:13

-2

您可以將字典轉換爲一個字符串,然後的eval(STR)後,回字典:

pydict = {'key1': 'val1', 'key2': 'val2'} 
variant = QtCore.QVariant(pydict) 
... 
pydict = eval(str(variant.toString())) 
print pydict 
>>> {'key1': 'val1', 'key2': 'val2'} 

只要記住,eval可能會失敗,如果它無法將其中一個鍵或值從字符串轉換爲字典。如果你有一個沒有built_in類型(str,int,list ..),這可能會發生,但在你的情況下,它不會有問題。