web-dev-qa-db-ja.com

引数をスロットに渡す

MouseReleaseEventを多数のQActionとQMenuでオーバーライドしたい...

connect(action1, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action5, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action10, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action25, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

connect(action50, SIGNAL(triggered()), this, SLOT(onStepIncreased()));

だから、スロットに引数を渡したいonStepIncreased(あなたが想像できるように、それらは1,5,10,25,50です)。どうすればできるか知っていますか?

70
Fatih Arslan

QSignalMapper を使用します。このような:

QSignalMapper* signalMapper = new QSignalMapper (this) ;
connect (action1, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action5, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action10, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action25, SIGNAL(triggered()), signalMapper, SLOT(map())) ;
connect (action50, SIGNAL(triggered()), signalMapper, SLOT(map())) ;

signalMapper -> setMapping (action1, 1) ;
signalMapper -> setMapping (action5, 5) ;
signalMapper -> setMapping (action10, 10) ;
signalMapper -> setMapping (action25, 25) ;
signalMapper -> setMapping (action50, 50) ;

connect (signalMapper, SIGNAL(mapped(int)), this, SLOT(onStepIncreased(int))) ;
111
TonyK

Qt 5とC++ 11コンパイラを使用して、そのようなことを行う慣用的な方法は、connectにファンクターを与えることです。

connect(action1,  &QAction::triggered, this, [this]{ onStepIncreased(1); });
connect(action5,  &QAction::triggered, this, [this]{ onStepIncreased(5); });
connect(action10, &QAction::triggered, this, [this]{ onStepIncreased(10); });
connect(action25, &QAction::triggered, this, [this]{ onStepIncreased(25); });
connect(action50, &QAction::triggered, this, [this]{ onStepIncreased(50); });

connectの3番目の引数は、名目上のオプションです。ファンクタが実行されるスレッドコンテキストを設定するために使用されます。ファンクターがQObjectインスタンスを使用する場合は常に必要です。ファンクターが複数のQObjectインスタンスを使用する場合、それらはライフタイムを管理する共通の親を持ち、ファンクターはその親を参照するか、オブジェクトがファンクターよりも長く存続することを保証する必要があります。

Windowsでは、これはMSVC2012以降で機能します。

108
Kuba Ober

QObject::sender() 関数は、スロットに信号を送ったオブジェクトへのポインターを返します。これを使用して、トリガーされたアクションを見つけることができます

12
king_nak

M_increaseメンバー変数を使用してQActionをサブクラス化することができます。
triggered()シグナルを新しいQActionサブクラスのスロットに接続し、正しいパラメーターで新しいシグナル(triggered(int number)など)を発行します。
例えば。

class MyAction:public QAction  
{  
public:  
    MyAction(int increase, ...)  
        :QAction(...), m_increase(increase)
    {  
        connect(this, SIGNAL(triggered()), this, SLOT(onTriggered()));  
    }  
protected Q_SLOTS:  
    void onTriggered()  
    {  
        emit triggered(m_increase);  
    }  

Q_SIGNALS:
    void triggered(int increase);   

private:  
    int m_increase;  
};
1
Kurt Pattyn
QVector<QAction*> W(100);
 W[1]= action1;
 W[5]= action5;
 W[10]= action10;
 W[25]= action25;
 W[50]= action50;

for (int i=0; i<100; ++i)
{
  QSignalMapper* signalmapper = new QSignalMapper();
  connect (W[i], SIGNAL(triggered()), signalmapper, SLOT(map())) ;
  signalmapper ->setMapping (W[i], i);
  connect (signalmapper , SIGNAL(mapped(int)), this, SLOT(onStepIncreased(int)));
} 
0
Jaziri Rami