2012-06-29 27 views
8

Dự án của tôi bao gồm một ứng dụng liên kết đến hai thư viện tĩnh. Mỗi thư viện tuyên bố Q_DECLARE_METATYPE<QUuid>, để sử dụng QUuid với QVariant, dẫn đến lỗi 'redefinition of struct QMetaTypeId<QUuid>'.Cách tránh các khai báo trùng lặp của Q_DECLARE_METATYPE <aCommonType>

Cách chính xác để thực hiện điều này trong khi vẫn giữ khả năng sử dụng từng thư viện riêng của mình trong các dự án khác nhau là gì?

+1

Tôi không hiểu tại sao bạn không nhận được "định nghĩa lại cấu trúc 'QUuid'". Chỉ tác giả của "QUuid" nên khai báo rằng id kiểu dữ liệu. Nếu không, nó chỉ là một câu hỏi về thời gian cho đến khi bạn gặp phải vấn đề này. –

+0

@ JohannesSchaub-litb QUuid được khai báo trong tiêu đề Qt. Tôi không có quyền kiểm soát mã đó, nhưng tôi vẫn muốn sử dụng loại đó trong QVariant. – szayat

Trả lời

4

Để giải quyết sự cố, bạn có thể gọi macro Q_DECLARE_METATYPE từ tệp triển khai cần thay vì gọi từ tệp tiêu đề hoặc as the documentation suggests, gọi từ tiêu đề riêng tư trong mỗi thư viện.

Nhưng vì QUuid cửa hàng nội dung của nó như là một QByteArray mà đã được hỗ trợ bởi QVariant, bạn không cần phải sử dụng Q_DECLARE_METATYPE để làm điều đó (từ Qt 4,8 chỉ):

// QVariant variant; 
// QUuid uuid; 
variant = uuid.toByteArray(); 
uuid = variant.toByteArray(); 

hoặc điều tương tự, nhưng một chút ít hiệu quả, với QString (trước Qt 4.8):

variant = uuid.toString(); 
uuid = variant.toString(); 

và kể từ QVariant sẽ ngầm chuyển đổi giữa QStringQByteArray, bạn có thể trộn toStringtoByteArray mà không gặp bất kỳ sự cố nào.

+0

Tiêu chí chính xác cho các tệp triển khai cần 'Q_DECLARE_METATYPE' là gì? Tôi đã thêm nó vào tất cả các tập tin thiết lập/nhận QUuid trong/từ một QVariant, cũng như tất cả các tệp kiểm tra tên kiểu QVariant và hành động trên nó. Mọi thứ dường như hoạt động, không có lỗi biên dịch và tất cả dữ liệu dường như được đọc/ghi chính xác. Tôi có thể dựa vào việc thiếu các lỗi biên dịch để đảm bảo Q_DECLARE_METATYPE được khai báo đúng khi cần thiết không? Về lý thuyết, có thể có những thất bại thầm lặng trong việc thiết lập các giá trị QVariant vì những sửa đổi này không? – szayat

+0

Lưu ý rằng tôi không thể sử dụng cách tiếp cận 'QString' hoặc' QByteArray', vì trong rất nhiều phần của mã của tôi, tôi không biết trước rằng tôi đang mong đợi một 'QUuid'. Tôi cần 'QVariant' để có thể xác định giá trị được lưu trữ dưới dạng' QUuid'. – szayat

+0

@szayat Miễn là bạn chỉ sử dụng 'QUuid' với' QVariant', nếu nó biên dịch, bạn sẽ không có bất kỳ cảnh báo nào sau này khi chạy. Bạn sẽ chỉ nhận được cảnh báo nếu bạn đang sử dụng 'QUuid' làm tham số trong kết nối tín hiệu/khe xếp hàng hoặc' invokeMethod' trước khi gọi 'qRegisterMetaType' hoặc nếu bạn muốn tuần tự hóa' QVariant' chứa 'QUuid' trên' QDataStream' mà không gọi 'qRegisterMetaTypeStreamOperators'. – alexisdm

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