2012-08-09 19 views
8

Qt documentation nói, giá trị trở lại của tín hiệu là không thể:Qt: Giá trị trả về của tín hiệu hoạt động, tại sao tài liệu chính thức lại nói rằng nó là không thể/bị cấm?

Tín hiệu sẽ được tự động tạo ra bởi các moc và không được triển khai trong tệp cpp. Họ không bao giờ có thể trả lại các loại (ví dụ: sử dụng khoảng trống).

liên quan SO câu hỏi:

  1. Can Qt signals return a value?
  2. Qt: meaning of slot return value?

Tuy nhiên, từ các thử nghiệm của tôi (Qt 4.8.1) tôi có thể nói giá trị trở lại làm việc:

  1. Nếu tín hiệu/vị trí nằm trong cùng một Thr ead, ConnectionType có thể Qt::AutoConnection
  2. Với tín hiệu/khe trong chủ đề khác nhau tôi cần phải sử dụng Qt::BlockingQueuedConnection

Vì vậy, trong mã của tôi, tôi gọi một tín hiệu bằng

QString dp = emit WscAircrafts::signalAircraftsJsonArray(); 

và moc tín hiệu trả về một QString ,

QString _t0; 
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) }; 
QMetaObject::activate(this, &staticMetaObject, 0, _a); 
return _t0; 

Đây là moc khe nơi nó trả lại QString

case 4: { QString _r = _t->slotAircraftJsonArray(); 
    if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; 

Tất cả điều này có vẻ khá thẳng về phía trước, vậy tại sao điều này mâu thuẫn với tài liệu? Trường hợp sẽ là vấn đề bằng cách sử dụng giá trị trả lại? Như đã nói, trong mã của tôi, điều này dường như hoạt động.

+3

điều gì sẽ xảy ra nếu tín hiệu được kết nối với nhiều vị trí? –

+2

Trong một câu hỏi tương tự khác trả lời nó nói: "Có vẻ như điều này là có thể. Tôi đã có thể phát ra một tín hiệu, và nhận giá trị từ khe mà tín hiệu được kết nối. Nhưng, vấn đề là nó chỉ trả về giá trị trả về cuối cùng từ nhiều vị trí được kết nối ". Phải là lý do tại sao họ không muốn quảng cáo tính năng này –

+0

@RomanSaveljev - nó cũng sẽ phải chặn cho đến khi vị trí đã hoàn thành? –

Trả lời

5

Vấn đề là các kiểu trả về không được kiểm tra tính tương thích tại thời gian kết nối, do đó, kết nối một khe trả về kép với tín hiệu trả về, sẽ tràn vào ngăn xếp (không có ý định chơi chữ) phao.

+0

Nhưng điều này cũng có nghĩa là, nếu kiểu trả về phù hợp và mọi thứ được thực hiện đúng thì sẽ không có vấn đề gì khi sử dụng chúng. –

+1

@HorstWalter có, trừ khi kết nối được xếp hàng đợi (trong trường hợp này, khe cắm hoãn lại có thể làm mất bộ nhớ giải phóng dài, nhưng tôi chưa kiểm tra sâu) hoặc có nhiều hơn một khe kết nối với tín hiệu (trong trường hợp này bạn ' d chỉ nhận được kết quả của vị trí cuối cùng). –

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