2016-07-22 25 views
5

Tôi muốn có thể gửi tín hiệu Qt qua mạng. Serializing một cuộc gọi tín hiệu là khá thẳng về phía trước sử dụng hệ thống kiểu meta Qt của:Cơ chế tín hiệu/khe của Qt qua mạng

  • Tạo một qMetaMethod sử dụng phương pháp tĩnh ::fromSignal
  • Lấy tên phương pháp, tên tham số, typeIds họ [1] và giá trị sử dụng phương pháp meta tạo.
  • Đóng gói mọi thứ vào định dạng ưa thích của bạn (JSON, XML) và gửi nó.

Nhưng cho đến nay tôi không thể tìm ra cách gọi tín hiệu bằng dữ liệu được tuần tự hóa: QMetaObject::invokeMethod(..) lấy tên tín hiệu/phương thức làm chuỗi. Vấn đề là các đối số: Chúng phải được cung cấp dưới dạng QGenericArgument và chỉ có thể được tạo bằng cách sử dụng macro Q_ARG yêu cầu loại thực tế (không phải là chuỗi tên hoặc typeId) và giá trị liên quan. Ngoài ra số lượng đối số phải được xác định tại thời gian biên dịch, không có số invokeMethod(..) có danh sách các đối số.

Tôi có thiếu gì đó không? Hoặc là có một cách tốt hơn/thay thế để làm điều này?

[1] Câu hỏi tiếp theo: Làm cách nào để đảm bảo rằng các loại luôn nhận được cùng loại ID khi chúng được đăng ký sử dụng Q_DECLARE_METATYPE(..)?

+0

Bạn không thiếu gì cả. –

+0

Er .... Tôi không nghĩ rằng cơ chế tín hiệu/khe được thiết kế để hoạt động trên toàn mạng. Tôi rất vui khi thấy bản thân mình đã chứng minh sai về vấn đề này. –

+0

IMHO, IPC dựa trên ổ cắm là một chìa khóa và sau đó chuyển đổi tín hiệu/khe cắm chỉ là đậu phộng có nghĩa là tín hiệu và khe cắm được biết đến cả hai quá trình trên các mặt khác nhau của IPC. – AlexanderVX

Trả lời

3

Giả sử bạn không thể tự mình tạo QGenericArgument. Bạn nên không, nhưng những gì bạn đang cố gắng làm là rất thực hiện phụ thuộc anyway. Không có gì nhiều: bạn cung cấp tên loại và con trỏ tới dữ liệu của một loại đã cho. Ví dụ:

QGenericArgument one() { 
    static const char type[] = "int"; 
    static const int data = "1"; 
    return QGenericArgument{type, (void*)&data); 
} 

Xem phần Khách truy cập Introspectable của this answer để biết thêm mã ví dụ.

Làm cách nào để đảm bảo rằng các loại luôn nhận được cùng loại ID khi chúng được đăng ký sử dụng Q_DECLARE_METATYPE(..)?

Bạn không. Bạn nên sử dụng tên loại, và mỗi quá trình nên giải quyết chúng để định kiểu cục bộ.

Trừ khi bạn muốn tự mình triển khai, hãy sử dụng thứ gì đó sẵn sàng thực hiện, chẳng hạn như giấy phép qt-remote-signals do MIT cấp phép.

+0

Có nó làm việc w/o bất kỳ lib nữa cho đến nay. Điều duy nhất không được đề nghị tôi đã làm là sử dụng ctor QGenericArgument trực tiếp. – Nils

+1

Liên quan: http://stackoverflow.com/questions/7721923/calling-qmetaobjectinvokemethod-with-variable-amount-of-parameters – Nils

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