Boost.Signals允許various strategies使用時隙的返回值來形成信號的返回值。例如。添加它們,形成vector
或返回最後一個。Qt信號可以返回一個值嗎?
的共同智慧(Qt文檔所表達[編輯:以及一些這個問題的答案])是沒有這樣的事情是可能的Qt的信號。
然而,當我運行下面的類定義商務部:
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();
};
不但沒有MOC抱怨與非void返回類型的信號,似乎要積極落實它在這樣的一種方式,允許返回值傳遞:
// 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;
}
所以:根據文檔,這件事情是不可能的。那麼moc在這裏做什麼?
Slots can have return values,那麼我們現在可以將帶有返回值的插槽連接到具有返回值的信號嗎?畢竟這可能嗎?如果是這樣,它有用嗎?
編輯:我不是要求解決方法,所以請不要提供任何。
編輯:它顯然沒有用Qt::QueuedConnection
模式(雖然QPrintPreviewWidget API,但它仍然存在和有用)。但是Qt::DirectConnection
和Qt::BlockingQueuedConnection
(或Qt::AutoConnection
,解析爲Qt::DirectConnection
時)怎麼辦?
感謝您的實際嘗試:)我編輯了您的代碼,使其更簡單。然而,問題仍然存在:如果它起作用(用「最後所謂的」語義),爲什麼文檔說它沒有? – 2011-05-05 19:58:08
一個很好的問題。我會假設文檔說它不起作用,因爲它只是部分返回值。信號發射*的真實返回值*應該是基於某種聚合器的所有結果的總和(如增加)。但是,沒有這一點,這是一個部分和未定義的結果(特別是在併發信號調用的情況下)。也許有一些編譯器的差異呢? – jsherer 2011-05-05 20:51:29
未記錄的行爲意味着你不能保證它仍然工作,比如說Qt 5.0 :) – Torp 2011-08-10 13:28:12