Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 保证它仍然在Qt 5.0中工作:)@jordan:我接受了你的答案,因为这是最接近的答案,一年来没有其他人有更好的答案。显然,我自己也尝试过,问题是返回值确实是返回的,但在连接时没有检查兼容性。因此,例如,将一个double-返回插槽连接到一个float-_C++_Qt_Return Value_Signals Slots_Boost Signals - Fatal编程技术网

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;

};