85

たくさんのQActionsとQMenusでmouseReleaseEventをオーバーライドしたい...

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です)。私がどうやってそれをすることができるか知っていますか?

4

6 に答える 6

133

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); });

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

Windows では、これは MSVC2012 以降で動作します。

于 2014-03-14T16:57:29.337 に答える
124

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))) ;
于 2011-03-01T10:57:50.260 に答える
14

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

于 2011-03-01T10:23:07.653 に答える
1

たぶん、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;  
};
于 2011-03-01T11:00:29.900 に答える