2012-02-13 37 views
12

Tôi chỉ học python và Qt những ngày này. Vì vậy, xin vui lòng xem xét rằng đây sẽ là một câu hỏi newbie, nhưng tôi bị mắc kẹt ở đây.Cách lấy dữ liệu python gốc từ QVariant

import sys 
from PyQt4.QtCore import * 

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

Tôi mong đợi data3 giống với dữ liệu1, 'chuỗi'. Tuy nhiên, trong data3 hệ thống của tôi là

PyQt4.QtCore.QString(u'string') 

Nó không phải là một vấn đề lớn nếu dữ liệu tôi muốn xử lý là đơn giản như ví dụ, nhưng tôi muốn để xử lý 'dict' kiểu dữ liệu vì vậy tôi cần phải sửa chữa vấn đề này.

Tôi nghĩ rằng đây là sự cố mã hóa nhưng không thể tìm cách khắc phục sự cố.

* Trong mỗi tài liệu Tôi tuyên bố rằng:

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

Bạn có thể giải quyết "vấn đề" đó bằng cách [đặt 'QString' api thành 2] (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/incompatible_apis.html) nhưng, tại sao bạn cần phải chuyển đổi thành 'QVariant' và quay lại? – Avaris

Trả lời

13

Bạn có thể làm việc xung quanh vấn đề này bằng cách gói dữ liệu của bạn trong một container bất biến:

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

làm thế nào (dữ liệu,) làm cho dữ liệu bất biến, không phải chỉ (dữ liệu) hoạt động như một bất biến hoặc thêm "," làm cho nó trở thành một bộ dữ liệu? –

+3

@san. Nó không làm cho _data_ bất biến. Nếu dữ liệu được đặt bên trong một thùng chứa không thay đổi (chẳng hạn như một tuple), không có nỗ lực chuyển đổi sẽ được thực hiện. Một tuple không thể được chuyển đổi thành một loại C++ tương đương, vì vậy cả tuple và nội dung của nó sẽ không thay đổi. Nó cũng đáng để viết ra rằng có một lợi thế hiệu suất từ ​​việc làm theo cách này, bởi vì nó bỏ qua tất cả các chi phí chuyển đổi qua lại giữa các kiểu Python và C++. – ekhumoro

0

Trước khi bạn có thể so sánh data1data3 bạn cần phải chuyển đổi QString để Python chuỗi đơn giản viết:

>>> same_as_data1 = str(data3) 

Bây giờ bạn đã đã lấy lại cùng một chuỗi:

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

Bất cứ nơi nào một chuỗi xuất hiện (dưới dạng khóa hoặc giá trị), nó sẽ được ánh xạ tới QString. Bạn có thể làm việc chuyển đổi hoặc bằng tay, ví dụ:

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

hoặc bạn có thể thay đổi hành vi QString, như Avaris chỉ ra ở trên.

+0

Cảm ơn câu trả lời của bạn. Có, nó hoạt động cho chuỗi. Bạn có thể cho tôi biết cách xử lý dữ liệu kiểu 'dict' không? 'code' QVariant ({'key1': 123}). toPyObject()' code' là 'code' {PyQt4.QtCore.QString (u'key1 '): 1234}' code' và tôi không thể chuyển đổi nó thành dữ liệu kiểu dict gốc –

-2

Bạn có thể chuyển đổi các dict vào một chuỗi và chỉ sau eval (str) nó trở lại một dict:

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

Chỉ cần nhớ rằng eval có thể thất bại nếu nó không thể chuyển đổi một trong các khóa hoặc giá trị từ chuỗi thành dict. điều này có thể xảy ra nếu bạn không có kiểu built_in nào (str, int, list ..) nhưng trong trường hợp của bạn nó sẽ không có vấn đề gì.

Các vấn đề liên quan