根据文档,插槽的返回值并不意味着什么.
然而在生成的moc代码中,我看到如果一个槽返回一个值,则该值用于某些东西.知道它做了什么?
这是我正在谈论的一个例子.这是从moc生成的代码中获取的.'message'是一个不返回任何内容的插槽,'selectPart'被声明为返回int.
case 7: message((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break;
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])));
if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break;
Run Code Online (Sandbox Code Playgroud) Qt文档说,信号的返回值是不可能的:
信号由moc自动生成,不得在.cpp文件中实现.他们永远不会有返回类型(即使用void).
相关的SO问题:
但是,根据我的试验(Qt 4.8.1),我可以告诉返回值确实有效:
Qt::AutoConnectionQt::BlockingQueuedConnection所以在我的代码中我通过调用信号
QString dp = emit WscAircrafts::signalAircraftsJsonArray();
Run Code Online (Sandbox Code Playgroud)
并且信号moc返回a QString,
QString _t0;
void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
return _t0;
Run Code Online (Sandbox Code Playgroud)
这里是它传回的插槽moc QString
case 4: { QString _r = _t->slotAircraftJsonArray();
if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break;
Run Code Online (Sandbox Code Playgroud)
所有这一切似乎都很直接,为什么这与文档的矛盾呢?使用返回值的问题在哪里?如上所述,在我的代码中,这似乎有效.
有人可以帮助如何连接信号和插槽吗?
我有接收实时数据的函数1(一个值)
void function1(int,double)
{
if(condition)
{
//some code
numb3 = 100;// double numb3 received new data
emit mySignal(numb3);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在其他函数中我有应该接收捕获值的变量
void function2(int,double)
{
double parameter2 = numb3;
}
Run Code Online (Sandbox Code Playgroud)
我试过像这样的组合
Q_SIGNAL double mySignal(double newValue=0){return newValue;};
Q_SLOT double slot1(double param=0) {emit mySignal(param); };
and then in function2{
connect(customPlot,SIGNAL(mySignal()), qApp, SLOT(slot1()));
double parameter2 = slot1();}
Run Code Online (Sandbox Code Playgroud)
但他们没有像我想的那样工作。
提前致谢!