Qt:如何通过像函数一样调用信号来知道信号槽机制是否调用了插槽

时间:2016-09-04 07:30:13

标签: qt qt-signals qt-slot

在插槽中我检查QObject::sender()但现在我想直接调用此插槽,就像一个功能。

我可以知道插槽内是如何调用此插槽的吗?是通过信号槽机制还是简单地通过像函数一样调用插槽?

3 个答案:

答案 0 :(得分:3)

  1. 在插槽中添加默认参数:

    public slots:
        void slot(bool calledBySignal = true);
    
  2. 直接调用插槽时将参数设置为false:

    void MyClass::method()
    {
        [...]
        slot(false);
        [...]
    }
    
  3. 保留connect()来电;不要在信号中添加bool参数,也不要将SLOT(slot())更改为SLOT(slot(bool))

  4. 缺点:设置参数很容易忘记。

    如果您的广告位不需要公开,因为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。

see Qt 4.8 documentation

这看起来像是一种清晰的区分方式,与使用QObject * QObject::sender() const相比,使用空指针没有任何麻烦。

关于, 费利克斯