0

私はc ++ Qtライブラリを使用していますが、何かしたいと思っています:

connect(actionB11, SIGNAL(triggered()), this, SLOT(SetSomething(1, 1)));
connect(actionB12, SIGNAL(triggered()), this, SLOT(SetSomething(1, 2)));
connect(actionB21, SIGNAL(triggered()), this, SLOT(SetSomething(2, 1)));
connect(actionB22, SIGNAL(triggered()), this, SLOT(SetSomething(2, 2)));

SIGNAL 関数は SLOT 関数と同じ数と引数の型を持つ必要があるため、上記のコードは機能しません。

それを行う方法はありますか?SetSomething11、SetSomething12 呼び出し SetSomething(1, 1) などの約 20 の関数を持ちたくありません。

4

3 に答える 3

0

SLOTシグニチャでは定数を使用できません。そこで、型を使用する必要があります。信号をスロットに接続する場合、スロットには信号と同じパラメータのサブセットが必要です。そうでない場合、それらを接続できず、QObject :: connect()はfalseを返します。

connect(actionB11, SIGNAL(triggered()),
        this, SLOT(SetSomething()));

このスロットはパラメーターを取りませんが、QObject :: sender()を使用して、シグナルを発行したオブジェクトへのポインターを取得できます。次に、このポインタを使用して、信号のソースを識別できます。

void SetSomething() {
    switch(sender()) {
    case actionB11;
        // do something
        break;
    case actionB12;
        // do something
        break;
    case actionB21;
        // do something
        break;
    case actionB22;
        // do something
        break;
    default:
        // Exceptional situation
    }
}

または、 QSignalMapperを使用して、スロットに追加の識別パラメーターを追加することもできます。

于 2012-10-22T11:01:44.173 に答える
0

QAction クラスを変更できます。

class QMyAction : public QAction
{
    Q_OBJECT
    QMyAction ( QObject * parent ) : 
    QAction(parent), _x(0), _y(0)
    {
         connect(this, SIGNAL(triggered(bool)), this, SLOT(re_trigger(bool)));
    } 
    QMyAction ( const QString & text, QObject * parent ) : 
    QAction (text, parent), _x(0), _y(0)
    {
         connect(this, SIGNAL(triggered(bool)), this, SLOT(re_trigger(bool)));
    }
    QMyAction ( const QIcon & icon, const QString & text, QObject * parent ) : 
    QAction(icon, text, parent), _x(0), _y(0)
    {
         connect(this, SIGNAL(triggered(bool)), this, SLOT(re_trigger(bool)));
    }
    void setX(int x)
    {
        _x = x;
    }
    int getX()
    {
        return _x;
    }
    void setY(int y)
    {
        _y = y;
    }
    int getY()
    {
        return _y;
    }

public slots:
    void re_trigger(bool)
    {
        emit triggered(_x, _y);
    }

signals:
    void triggered(int,int);

private:
    int _x;
    int _y;
};

これで、triggered(int,int) を SetSomething(int,int) に接続できます。ただし、x と y を設定する必要があります。そうでない限り、それらは常に 0 になります。

于 2012-10-22T10:56:36.147 に答える
0

このような状況では、次の 3 つの簡単なオプションがあります。

  1. 各 QAction を独自のスロットに接続する (良くない)
  2. QSignalMapperを使用する
  3. 各 QAction を QActionGroup に追加し、シグナルを使用して、QActionGroup::triggered(QAction*)各 QAction のデータを設定します (QAction::setData()およびを参照QAction::data()) 。

QAction のデータを設定する場合、1 つの QVariant (つまり、1 つの値) のみを格納できます。したがって、2 つの値が必要な場合は、次のような単純なマッピングを作成することをお勧めします。

void Window::onActionGroupTriggered(QAction *action);
{
    int i = action->data().toInt();
    int a, b;
    a = i / 10;
    b = i - 10;
    setSomething(a, b); // for example if i = 15, then a = 1 and b = 5
}
于 2012-10-22T10:57:23.267 に答える