防止连接到插槽(“真正”专用插槽)

时间:2012-06-21 10:58:40

标签: c++ qt

使用Qt我知道private slots表示在直接调用时插槽是私有的,但是connect()仍然可以允许信号连接到插槽,无论是私有的,公共的还是我猜的,受保护的。

那么,有没有办法让插槽真的是私有的,这样只能在类中建立连接?我在这里想的是因为QTimer::singleShot调用了一个插槽,但是我要调用的函数我不希望在类之外可以访问。我确信还有其他原因,但这是我找到的主要原因。

3 个答案:

答案 0 :(得分:2)

只需使用timerEventstartTimer代替slot和QTimer :: singleShot。

答案 1 :(得分:2)

如果您真的想强制执行此操作,并且您认为正确的文档无法解决此问题,请将插槽添加到一个额外的类中,该类具有私有构造函数并将调用转发给您的真实类。

class PrivateSlotClass : public QObject
{
Q_OBJECT
friend class YourRealClass;
PrivateSlotClass( YourRealClass ) : QObject( YourRealClass ){}
private slots:
  void theSlot(){ static_cast<YourRealClass*>(parent())->theFunction();
};

class YourRealClass : public QObject
{
public:
   YourRealClass();
friend class PrivateSlotClass;
private:
 void theFunction();
};

YourRealClass::YourRealClass(){ 
    PrivateSlotClass* myPrivateSlot = new PrivateSlotClass(this);
    QTimer::singleShot( 50, myPrivateSlot, SLOT(theSlot()) );
}
void YourRealClass::theFunction()
{
/* your slot code here */
}

答案 2 :(得分:0)

我认为可以在你的插槽中添加一个参数和相应的信号,如下所示:

...
private slots:
    void slot(..., QObject* sender = 0);
...

void YourClass::slot(..., QObject* sender)
{
    if (sender != (QObject*)this)
    {
        /* do nothing or raise an exception or do whatever you want */
    }
    ...
}

当然它不会让你的插槽“完全”私密,但它不会让你的代码在收到来自你对象外部的信号后被执行。