C++ 保证它仍然在Qt 5.0中工作:)@jordan:我接受了你的答案,因为这是最接近的答案,一年来没有其他人有更好的答案。显然,我自己也尝试过,问题是返回值确实是返回的,但在连接时没有检查兼容性。因此,例如,将一个double-返回插槽连接到一个float-
C++ 保证它仍然在Qt 5.0中工作:)@jordan:我接受了你的答案,因为这是最接近的答案,一年来没有其他人有更好的答案。显然,我自己也尝试过,问题是返回值确实是返回的,但在连接时没有检查兼容性。因此,例如,将一个double-返回插槽连接到一个float-,c++,qt,return-value,signals-slots,boost-signals,C++,Qt,Return Value,Signals Slots,Boost Signals,保证它仍然在Qt 5.0中工作:)@jordan:我接受了你的答案,因为这是最接近的答案,一年来没有其他人有更好的答案。显然,我自己也尝试过,问题是返回值确实是返回的,但在连接时没有检查兼容性。因此,例如,将一个double-返回插槽连接到一个float-返回信号在运行时很有可能崩溃。如果所有线程都在同一个线程上,它将工作,因为您将在插槽上进行同步函数调用。如果您有一个多线程应用程序,那么调用将是异步的,并且不会有返回值。 class Object : public QObject {
保证它仍然在Qt 5.0中工作:)@jordan:我接受了你的答案,因为这是最接近的答案,一年来没有其他人有更好的答案。显然,我自己也尝试过,问题是返回值确实是返回的,但在连接时没有检查兼容性。因此,例如,将一个
double
-返回插槽连接到一个float
-返回信号在运行时很有可能崩溃。如果所有线程都在同一个线程上,它将工作,因为您将在插槽上进行同步函数调用。如果您有一个多线程应用程序,那么调用将是异步的,并且不会有返回值。
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();
};
// 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;
}
void ClassObj::method(return_type * return_)
{
...
if(return_) *return_ = ...;
}
// somewhere else in the code...
return_type ret;
emit this->method(&ret);
#include <QObject>
#include <QDebug>
class TestClass : public QObject
{
Q_OBJECT
public:
TestClass();
Q_SIGNALS:
QString testSignal();
public Q_SLOTS:
QString testSlot1() {
return QLatin1String("testSlot1");
}
QString testSlot2() {
return QLatin1String("testSlot2");
}
};
TestClass::TestClass() {
connect(this, SIGNAL(testSignal()), this, SLOT(testSlot1()));
connect(this, SIGNAL(testSignal()), this, SLOT(testSlot2()));
QString a = emit testSignal();
qDebug() << a;
}
int main() {
TestClass a;
}
#include "main.moc"
foreach slot in connectedSlotsForSignal(signal):
value = invoke slot with parameters from signal
return value
#include <QtCore>
#include <QtGui>
class SignalsRet : public QObject
{
Q_OBJECT
public:
SignalsRet()
{
connect(this, SIGNAL(Get(QString*)), SLOT(GetCurrentThread(QString*)), Qt::DirectConnection);
connect(this, SIGNAL(GetFromAnotherThread(QString*)), SLOT(ReadObject(QString*)), Qt::BlockingQueuedConnection);
edit.setText("This is a test");
}
public slots:
QString call()
{
QString text;
emit Get(&text);
return text;
}
signals:
void Get(QString *value);
void GetFromAnotherThread(QString *value);
private slots:
void GetCurrentThread(QString *value)
{
QThread *thread = QThread::currentThread();
QThread *mainthread = this->thread();
if(thread == mainthread) //Signal called from the same thread that SignalsRet class was living
ReadObject(value);
else //Signal called from another thread
emit GetFromAnotherThread(value);
}
void ReadObject(QString *value)
{
QString text = edit.text();
*value = text;
}
private:
QLineEdit edit;
};