Boost.Signals cho phép various strategies sử dụng giá trị trả về của các vị trí để tạo thành giá trị trả về của tín hiệu. Ví dụ. thêm chúng, tạo thành một vector
trong số chúng hoặc trả lại cái cuối cùng.Tín hiệu Qt có thể trả về một giá trị không?
Sự khôn ngoan (thể hiện trong tài liệu Qt [EDIT: cũng như một số câu trả lời cho câu hỏi này ]) là không có điều đó là có thể với tín hiệu Qt.
Tuy nhiên, khi tôi chạy moc vào định nghĩa lớp sau đây:
class Object : public QObject {
Q_OBJECT
public:
explicit Object(QObject * parent=0)
: QObject(parent) {}
public Q_SLOTS:
void voidSlot();
int intSlot();
Q_SIGNALS:
void voidSignal();
int intSignal();
};
Không chỉ không Mộc phàn nàn về các tín hiệu với kiểu trả về không có hiệu lực, nó có vẻ tích cực thực hiện nó trong ví dụ một cách để phép một giá trị trả về để vượt qua:
// SIGNAL 1
int Object::intSignal()
{
int _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
return _t0;
}
vì vậy: theo các tài liệu, điều này là không thể. Vậy moc đang làm gì ở đây?
Slots can have return values, vì vậy chúng tôi có thể kết nối một vị trí với giá trị trả về tín hiệu với giá trị trả lại ngay bây giờ không? Có thể là có thể, sau khi tất cả? Nếu vậy, nó có hữu ích không?
CHỈNH SỬA: Tôi không yêu cầu giải pháp, vì vậy, vui lòng không cung cấp bất kỳ giải pháp nào.
CHỈNH SỬA: Điều này rõ ràng không hữu ích ở chế độ Qt::QueuedConnection
(không phải là QPrintPreviewWidget API, mặc dù vẫn tồn tại và hữu ích). Nhưng những gì về Qt::DirectConnection
và Qt::BlockingQueuedConnection
(hoặc Qt::AutoConnection
, khi nó giải quyết để Qt::DirectConnection
).
cảm ơn bạn đã thực sự cố gắng :) Tôi đã chỉnh sửa mã của bạn trở nên đơn giản và ngắn hơn. Tuy nhiên, câu hỏi vẫn đứng vững: nếu nó hoạt động (với "ngữ nghĩa cuối cùng"), tại sao các tài liệu nói nó không? –
Một câu hỏi hay. Tôi sẽ giả định các tài liệu nói rằng nó không hoạt động bởi vì nó chỉ là một giá trị trả về một phần. Giá trị trả về true của phát xạ tín hiệu * nên * là tổng hợp của tất cả các kết quả dựa trên một số loại trình tổng hợp (như tăng cường). Nhưng, nếu không có, đó là một kết quả một phần và không xác định (đặc biệt là trong bối cảnh của một cuộc gọi tín hiệu đồng thời). Có lẽ có một số khác biệt về trình biên dịch? – jsherer
Hành vi không có giấy tờ có nghĩa là bạn không được đảm bảo rằng ứng dụng vẫn hoạt động, ví dụ: Qt 5.0 :) – Torp