2

私はC++とQtから始めています。QPushButtons のマトリックスがあり、それらのクリック イベントを処理したいと考えています。問題は、配列内のボタンの座標をスロットに伝えることができないため、それらで遊ぶことができないことです。整数をスロットに渡すことに成功しましたが、両方の座標を渡すことはできませんでした。私は自分自身を十分に明確にしているかどうかわかりません...それは私の問題のあるコードです:

for (int i = 0; i < mapSize_x; i++) {
    for (int j = 0; j < mapSize_y; j++) {
        buttonsArray[i][j] = new QPushButton();
        ui->mainLayout->addWidget(buttonsArray[i][j], i, j);

        connect(buttonsArray[i][j], SIGNAL(clicked()),
                signalMapper, SLOT(map()));
        signalMapper->setMapping(buttonsArray[i][j], i, j); // here
    }
}
connect(signalMapper, SIGNAL(mapped(int, int)),
        this, SLOT(buttonClick(int, int)));

setMapping は 2 つのパラメーターしか受け付けないので、3 つ渡したいと思います。回避策はありますか? 私はたくさんグーグルで検索しましたが、まだ答えが見つかりません。また、座標の代わりに QPushButton オブジェクトを渡そうとしましたが、失敗しました。前もって感謝します。

4

2 に答える 2

2

QHashを使用してプッシュボタンを格納し、ボタン自体をキーとして、それらの行と列を含むペアを指すことを検討してください。その後、ウィジェット ポインターに基づいてマッピングを設定し、シグナル マッパーがシグナルを発信したときに関連する行と列を検索できるようになります。たとえば、次のようにクラス データ メンバーを宣言します。

QHash<QPushButton*, QPair<int, int> > buttonHash;

次に、上記のコードは次のようになります

for (int i = 0; i < mapSize_x; i++) {
    for (int j = 0; j < mapSize_y; j++) {
        QPair<int, int> gridPair(i, j);
        QPushButton* button = new QPushButton();
        buttonHash.insert(button, gridPair);
        ui->mainLayout->addWidget(button, i, j);

        connect(button, SIGNAL(clicked()),
                signalMapper, SLOT(map()));
        signalMapper->setMapping(button, qobject_cast<QWidget*>(button));
    }
}
connect(signalMapper, SIGNAL(mapped(QWidget*)),
        this, SLOT(buttonClick(QWidget*)));

最後に、buttonClickスロットは次のようになります。

void SomeClass::buttonClick(QWidget* widget) {
   QPair<int, int> pair = buttonHash.value(qobject_cast<QPushButton*>(widget));
   int myRow = pair.first;
   int myColumn = pair.second;

   ...
}

この問題に取り組むには、他に少なくとも 2 つの方法があります。

  1. 行と列を文字列に結合して使用することができますQSignalMapper::setMapping(QObject*, const QString&)buttonClickこれには、スロット内の文字列から行と列を引き出すためのロジックが必要になります。
  2. ビット シフトとビットごとの OR を使用して、行と列を 1 つの整数に結合することを試みることができます。その後、に頼ることができますQSignalMapper::setMapping(QObject*, int)buttonClickこれには、スロット内の整数から行と列を引き出すためのロジックが必要になります。

これらの他のソリューションについては、やや見苦しいので詳しく説明しません。上記で提供したソリューションは、依然として最も直感的です。

于 2012-10-05T17:12:48.643 に答える
0

このQSignalMapperクラスは特定の状況で非常に役立つ場合がありますが、現在のユースケースではやり過ぎかもしれません。

代わりに、QButtonGroupの使用を検討してください。これは、まさにあなたがやろうとしていることのために設計されており、はるかにクリーンでシンプルなAPIを提供します。

于 2012-10-05T17:27:23.417 に答える