使用 Qt 我知道这private slots
意味着当直接调用时插槽是私有的,但connect()
仍然可以允许信号连接到插槽,无论是私有的、公共的还是我猜是受保护的。
那么,有没有办法让一个插槽真正私有化,这样只能在一个类中进行连接?我在这里想的是因为QTimer::singleShot
它调用了一个插槽,但我想调用的函数我不想在课堂之外访问。我确信还有其他原因,但这是我目前发现的主要原因。
只需使用timerEvent和startTimer而不是 slot 和 QTimer::singleShot。
如果您真的想强制执行此操作,并且您认为适当的文档无法解决此问题,请将插槽添加到一个额外的类中,该类具有私有构造函数并将调用中继到您的真实类。
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 */
}
我认为可以向您的插槽和相应的信号添加一个参数,如下所示:
...
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 */
}
...
}
当然,它不会使您的插槽“完全”私有,但它不会让您的代码在收到来自对象外部的信号后执行。