阻止连接到插槽("Really"专用插槽)
Prevent connection to a slot ("Really" private slots)
使用Qt我知道private slots
意味着该插槽在直接调用时是私有的,但是connect()
仍然可以允许信号连接到插槽,无论是私有的,公共的,还是我猜是受保护的。
那么,有没有办法使插槽真正私有,这样只能在类中完成连接?我在这里想的是因为调用插槽的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 */
}
只需使用 timerEvent 和 startTimer 而不是 slot 和 QTimer::singleShot。
我认为可以像这样为您的插槽和相应的信号再添加一个参数:
...
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 */
}
...
}
当然,它不会使您的插槽"完全"私有,但它不会让您的代码在接收到来自对象外部的信号后执行。
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- Qt插槽调用了两次
- C++Qt信号和插槽
- 从插槽调用 QApplication::p rocessEvents 会导致再次调用同一插槽
- 阻止连接到插槽("Really"专用插槽)