Сигнал, возвращающий значение
Все знают, что слоты могут возвращать значения. Это имеет смысл, так как слот Qt можно вызвать напрямую, как обычный метод. Не всем, однако, известно, что сигнал тоже может возвращать значение, а именно, значение того слота, с которым он связан. Например, пусть у нас есть два класса: A и B.
class A : public QObject
{
Q_OBJECT
public:
A(QObject *parent = 0):QObject(parent)
{}
public slots:
int mySlot()
{
return 10;
}
};
class B : public QObject
{
Q_OBJECT
public:
B(QObject *parent = 0):QObject(parent)
{
connect(this, SIGNAL(mySignal()), &a, SLOT(mySlot()));
}
int getValue()
{
return emit mySignal();
}
signals:
int mySignal();
private:
A a;
};
Вызов функции getValue() вернет значение 10. Этот метод конечно имеет ограничения. Он сработает только если используется прямое соединение сигнала и слота (DirectConnection), если с сигналом связано несколько слотов, то будет возвращено значение только одного из них и т.д.
© 2011 Андрей Боровский
я думал, что emit signal не ожидает выполнения слота. Выходит, что был не прав?
Зависит от того, как они были связаны. Существует синхронное соединение, когда сигнал просто вызывает функцию слота, и асинхронное, когда для слота создается событие, которое может быть обработано позже. В документации по QObject::connect() это все описано.
Искал в документации, нашёл, что сигнал ‘They can never have return types’, то естьне возращает. На практике работает, но…. Если сигнал не соединён ни с одним слотом, то возвращает неопределённое значение. И проверить соединён он или нет и что он вернул, нет никакой возможности. Жаль ((((
>> ‘They can never have return types’, то естьне возращает.
Ну да, это недокументированная фича. И не факт что будет работать в Qt 5.
>> Если сигнал не соединён ни с одним слотом, то возвращает неопределённое значение.
Ну, в общем эти возвращаемые значения — просто прикол такой. По хорошему ими пользоваться не надо, так как код с сигналами/слотами должен работать одинаково в блокирующем и асинхронном режимах.
Искал в документации, нашёл, что сигнал ‘They can never have return types’, то естьне возращает. На практике работает, но…. Если сигнал не соединён ни с одним слотом, то возвращает неопределённое значение. И проверить соединён он или нет и что он вернул, нет никакой возможности. Жаль ((((
+1
Мне правда не очень понятно, чего «жаль». Ведь сигналы, по сути, — средства асинхронной коммуникации. Допустим, вы написали код, где сигнал возвращает значение. А потом решили перенести соответствующий объект в отдельный поток…