在插槽中我检查QObject::sender()
但现在我想直接调用此插槽,就像一个功能。
我可以知道插槽内是如何调用此插槽的吗?是通过信号槽机制还是简单地通过像函数一样调用插槽?
答案 0 :(得分:3)
在插槽中添加默认参数:
public slots:
void slot(bool calledBySignal = true);
直接调用插槽时将参数设置为false:
void MyClass::method()
{
[...]
slot(false);
[...]
}
保留connect()
来电;不要在信号中添加bool参数,也不要将SLOT(slot())
更改为SLOT(slot(bool))
。
缺点:设置参数很容易忘记。
如果您的广告位不需要公开,因为connect()
仅从类内处理它,您应该将其设为私有并添加一个包装方法相反,但是当你从课堂内调用它时,你仍然需要一些纪律。约翰'建议可以解决这些问题。
答案 1 :(得分:1)
在这两种情况下,您都可以查看sender()
。在通过信号/槽机制调用槽的情况下,发送器将返回指针,而当作为方法调用时,它将返回空指针。
简单示例:
class Test : public QObject
{
Q_OBJECT
signals:
void signal();
public slots:
void slot() { qDebug() << sender(); }
};
使用:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Test test;
Test test2;
QObject::connect(&test, &Test::signal, &test2, &Test::slot);
test.signal(); //slot is caled by signal
test2.slot(); //slot is called as method directly
return a.exec();
}
输出:
测试(0xa8e8aff5b0)
QObject的(为0x0)
答案 2 :(得分:0)
区分直接函数调用与信号/插槽调用的另一种思路:
使用方法int QObject :: senderSignalIndex()const并检查-1
if(QObject::senderSignalIndex() == -1){
//called directly as a function
} else {
// invoked via Signal/SLot mechanism
}
返回调用当前正在执行的插槽的信号的元方法索引,该信号是sender()返回的类的成员。如果在信号激活的插槽之外调用,则返回-1。
这看起来像是一种清晰的区分方式,与使用QObject * QObject::sender() const
相比,使用空指针没有任何麻烦。
关于, 费利克斯