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です)。どうすればできるか知っていますか?
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))) ;
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以降で機能します。
QObject::sender()
関数は、スロットに信号を送ったオブジェクトへのポインターを返します。これを使用して、トリガーされたアクションを見つけることができます
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;
};
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)));
}