2010-07-07 23 views
6

Tôi đang viết mã thử nghiệm sẽ tự động lặp lại qua tất cả các tiện ích của Q_PROPERTY và một số thuộc tính đang sử dụng các loại được đăng ký qua qRegisterMetaType. Nếu tôi muốn đọc/ghi chúng vào QVariant tôi cần phải sử dụng QVariant :: UserType khi lưu trữ chúng vào biến thể. Càng xa càng tốt.Làm thế nào để xác minh QVariant loại QVariant :: UserType là loại dự kiến?

Nhưng khi tôi muốn kiểm tra đọc và viết của các thuộc tính này, tôi cũng cần phải biết loại của chúng. Đối với các công cụ đã được các loại qt tiêu chuẩn, tôi có thể thực hiện điều này thông qua QVariant :: type() nhưng vì tôi có rất nhiều usertypes, điều này sẽ được thực hiện như thế nào?

Từ api của QVariant, tôi phát hiện này:

bool QVariant::canConvert (Type t) const

Nhưng tôi hơi nghi ngờ nếu điều này sẽ dẫn đến không đúng chủng loại trong trường hợp enums?

Vì vậy, cách nào là cách dễ dàng để xác minh loại loại người dùng nào được lưu trữ trong QVariant?

Trả lời

11

Đối với loại do người dùng xác định có QVariant::userType(). Nó hoạt động như QVariant :: type() nhưng trả về kiểu số nguyên id của kiểu do người dùng định nghĩa trong khi QVariant :: type() luôn trả về QVariant :: UserType.

Ngoài ra còn có QVariant::typeName() trả về tên của loại dưới dạng chuỗi.

EDIT:

Nó có thể phụ thuộc vào cách bạn đặt QVariant. Trực tiếp sử dụng QVariant::QVariant(int type, const void * copy) không được khuyến khích.

Nói rằng tôi có ba loại như thế này:

class MyFirstType 
{ 
    public: 
     MyFirstType(); 
     MyFirstType(const MyFirstType &other); 
     ~MyFirstType(); 

     MyFirstType(const QString &content); 

     QString content() const; 

    private: 
     QString m_content; 
}; 
Q_DECLARE_METATYPE(MyFirstType); 

Thứ ba mà không Q_DECLARE_METATYPE

tôi lưu trữ chúng trong QVariant:

QString content = "Test"; 

MyFirstType first(content); 

MySecondType second(content); 

MyThirdType third(content); 

QVariant firstVariant; 
firstVariant.setValue(first); 

QVariant secondVariant = QVariant::fromValue(second); 

int myType = qRegisterMetaType<MyThirdType>("MyThirdType"); 

QVariant thirdVariant(myType, &third); // Here the type isn't checked against the data passed 

qDebug() << "typeName for first :" << firstVariant.typeName(); 
qDebug() << "UserType :" << firstVariant.userType(); 
qDebug() << "Type : " << firstVariant.type(); 

[...] 

tôi nhận được:

typeName for first : MyFirstType 
UserType : 256 
Type : QVariant::UserType 

typeName for second : MySecondType 
UserType : 257 
Type : QVariant::UserType 

typeName for third : MyThirdType 
UserType : 258 
Type : QVariant::UserType 
+0

Tuy nhiên , có vẻ như trong trường hợp của QVarian t :: Phương thức UserType, typeName() trả về "UserType" và typeName() trả về giá trị QVariant :: UserType enum. Vì vậy, cả hai đều vô dụng – rasjani

+0

Đối tượng thời gian là tốt, tôi có thể làm kiểm tra cũng với typecasting để ví dụ của bạn cũng propably hoạt động tốt. Nhưng câu hỏi của tôi là về enum's mà không phải là một loại lớp và người ta có thể propably typecast bất kỳ biến số thành một enum. Nhưng như đã nói. Tôi sẽ kiểm tra mã của bạn. – rasjani

+0

Ah, xin lỗi, tôi không để ý đến phần đó. Tôi đã thử và có vẻ như nó có thể đăng ký một loại enum với Q_DECLARE_METATYPE hoặc qRegisterMetaType và sử dụng nó theo cùng một cách. Các tài liệu chỉ nói về class hoặc struct với constructor mặc định công cộng, copy constructor và destructor, vì vậy tôi không hoàn toàn chắc chắn, nhưng tôi nghĩ nó sẽ làm việc cho bất kỳ kiểu nào có giao diện ngầm để tạo, sao chép và hủy diệt. – Leiaz

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