1

私は現在、友人とゲームに取り組んでいますが、今は行き詰まっています。スロットに 2 つの引数を渡す必要があります。1 つのスロットを 2 つのボタンに使用し、ボタンの 1 つは加算に使用し、もう 1 つは減算に使用します。これは、0 (減算の場合) または 1 (加算の場合) のいずれかの引数になります。もう 1 つの引数は一種の ID になります。これは、これら 2 つのボタンのセットがいくつかあるためです。コードで他のいくつかのスロットを使用しました。これらのスロットでは、次のように QSignalMapper を使用しています。

Button * button = new Button(argument1, argument2, argument3);

int num = 1;

QSignalMapper * signalMapper = new QSignalMapper(this);

connect(button, SIGNAL(clicked()), signalMapper, SLOT(map)));
signalMapper->setMapping(button, num);
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(mySlot(int)));

scene->addItem(button);

スロットに 2 つの引数を渡す方法はありますか?

4

3 に答える 3

4

sender()代わりに次の関数を使用してください。

void mySlot()
{
    if (sender() == addButton)
        ...
    else
        ...
}

あなたの場合、int引数を削除mySlotして次のことを行うことができます。

 connect(addButton, SIGNAL(clicked()), someObject, SLOT(mySlot()));
 connect(subButton, SIGNAL(clicked()), someObject, SLOT(mySlot()));

次に、sender関数を使用してソースを特定します。

あなたの質問に直接答えるには、はい、最大 8 つの引数 (C++11 より前) または任意の数 (C++11 以降) を受け入れるスロットを定義できます。問題は、同じ数またはそれ以上のパラメーターを持つ信号に接続する必要があることです。

たとえば、署名付きの信号がある場合notify(int, bool, QString)、次のいずれかの署名付きのスロットに接続できます。

  • someSlot(int)
  • someSlot(int, bool)
  • someSlot(int, bool, QString)
于 2016-06-23T20:42:02.693 に答える
3

QSignalMapperパラメータは 1 つだけです。ただし、次のいずれかの方法を使用して、ボタンをいくつかのセットに分割できます。

  • 各セット ID は既知の番号から開始します。つまり、最初のセットは 100 から開始し、2 番目のセットは 200 から開始するというように、番号を 100 で割るとセットを簡単に検出できます。102 は最初のセットを表し、ボタン ID = 2 を表します。
  • QStringトークンを使用してボタン番号からセット番号を分割できる場所でマッピングを使用します。つまり1;2、(最初のセット、ボタン ID = 2) を使用しQString::split()ます。

スロットの例:

void mySLot (const QString& id)
{
    QStringList tokens = id.split (";");

    if (tokens.count () == 2) {
        int setId    = tokens.at(0).toInt ();
        int buttonId = tokens.at(1).toInt ();

        /* Your code goes here */
    }
}
于 2016-06-23T20:28:04.440 に答える