0

Qtを使用private slotsすると、スロットが直接呼び出されたときにプライベートであることを意味しますが、connect()プライベート、パブリック、またはおそらく保護されているかどうかにかかわらず、信号をスロットに接続することができます。

それで、クラス内の接続だけができるように、スロットを本当にプライベートにする方法はありますか?ここで私が考えているのはQTimer::singleShot、スロットを呼び出すためですが、呼び出したい関数は、クラスの外部からアクセスできるようにしたくありません。他にも理由があると思いますが、これが私が見つけた現時点での主な理由です。

4

3 に答える 3

2

Just use timerEvent and startTimer instead of slot and QTimer::singleShot.

于 2012-06-21T11:07:33.227 に答える
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 */
}
于 2012-06-21T11:09:17.047 に答える
0

次のように、スロットと対応するシグナルにもう1つの引数を追加することが可能だと思います。

...
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 */
    }
    ...
}

もちろん、スロットを「完全に」プライベートにすることはできませんが、オブジェクトの外部からシグナルを受信した後にコードを実行することはできません。

于 2012-06-21T11:41:22.080 に答える