2009-03-17 35 views
8

Tôi có một lớp tùy chỉnh được gọi là Tiền mà tôi đã khai báo với Q_DECLARE_METATYPE().Chuyển đổi QVariant của loại tùy chỉnh thành QString

class Money { 
public: 
    Money(double d) { 
    _value = d; 
    } 
    ~Money() {} 
    QString toString() const { 
    return QString(_value); 
    } 
private: 
    double _value; 
}; 
Q_DECLARE_METATYPE(Money); 

Money m(23.32); 

tôi lưu trữ trong một QVariant và tôi muốn chuyển nó sang một QString:

QVariant v = QVariant::fromValue(m); 

QString s = v.toString(); 

Biến s kết thúc lên được một chuỗi null vì QVariant không biết làm thế nào để chuyển đổi của tôi loại tùy chỉnh cho chuỗi. Có cách nào để làm điều này không?

Trả lời

4

Ok tôi đã tìm thấy một cách để thực hiện việc này. Tôi tạo ra một loại mẹ gọi CustomType với một phương pháp ảo mà tôi có thể thực hiện để chuyển đổi kiểu tùy chỉnh của tôi đến một QVariant "bình thường":

class CustomType { 
public: 
    virtual ~CustomType() {} 
    virtual QVariant toVariant() const { return QVariant(); } 
}; 

sau đó tôi được thừa kế lớp tiền tùy chỉnh của tôi từ này.

class Money : public CustomType { 
public: 
    Money(double d) { 
    _value = d; 
    } 
    ~Money() {} 
    QVariant toVariant() { 
    return QVariant(_value); 
    } 
private: 
    double _value; 
}; 

Điều này cho phép tôi chuyển các biến tiền tùy chỉnh có trong QVariant để tôi có thể sử dụng chúng trong hệ thống thuộc tính Qt, khung mô hình/khung nhìn hoặc mô-đun sql.

Nhưng nếu tôi cần lưu trữ biến tiền tùy chỉnh của tôi trong cơ sở dữ liệu (sử dụng QSqlQuery.addBindValue) nó không thể là một lớp tùy chỉnh, nó phải là một loại đã biết (như gấp đôi).

QVariant myMoneyVariant = myqobject.property("myMoneyProperty"); 
void *myData = myMoneyVariant.data(); 
CustomType *custType = static_cast<CustomType*>(myData); 
QVariant myNewVariant = ct->toVariant(); 

myNewVariant hiện nay có loại tăng gấp đôi, không tiền để tôi có thể sử dụng nó trong một cơ sở dữ liệu:

myqsqlquery.addBindValue(myNewVariant); 

hoặc chuyển đổi nó thành một chuỗi:

QString s = myNewVariant.toString(); 
+4

Tôi nghĩ rằng void * QVariant :: data() phương pháp không có trong tài liệu Qt. – darkadept

-1

Điều gì sẽ xảy ra nếu bạn thử theo cách này?

class Money { 
public: 
    Money(double d) { 
    _value = d; 
    } 
    ~Money() {} 
    QString toString() const { 
    return _value.toString(); 
    } 
private: 
    double _value; 
}; 
+0

Bạn chắc chắn bạn có thể gọi một phương thức trên một kiểu dữ liệu gốc? – dirkgently

+0

Không. double không có phương thức .toString(). Điều đó sẽ không hiệu quả. – darkadept

+0

Chỉ cần thay thế return _value.toString(); trả về QVariant :: number (_value); – Doodloo

0

Bạn có chắc chắn các công việc sau đây không?

trả về QString (_value);

Tôi dường như không tìm thấy số điện thoại QString mà phải mất double. Bạn sẽ phải tự mình chuyển đổi. Cách Qt là:

QString toString() const { 
QVariant d(_value); 
return d.ToQString(); 
} 
+0

Bạn nói đúng, không có ctor nào tăng gấp đôi. Tôi nên viết dòng đó là "số trả về QString :: (_value);" – darkadept

+0

Hoặc nên khắc phục sự cố của bạn. – dirkgently

+0

QVariant tiêu thụ nhiều bộ nhớ hơn. QString :: number (_value) là một giải pháp tốt hơn. –

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