web-dev-qa-db-ja.com

QSignalMapperはどのように機能しますか?

ここに私の投稿の後: シグナルとスロットをqcheckboxに関連付けて動的に作成します 関連付ける必要があります:

•関数clicked()へのqCheckBoxをクリックしたときのシグナルcliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

そのためには、QSignalMapperを使用する必要があります。2時間かけてどのように機能するかを理解しようとすると、良い結果が得られません。作成したコードは次のとおりです。これは明らかに間違っています。

 QSignalMapper *m_sigmapper = new QSignalMapper(this);
 QObject::connect(pCheckBox, SIGNAL(mapped(QTableWidget*,int, QCheckBox*)), pCheckBox, SIGNAL(clicked()));
 QObject::connect(this, SIGNAL(clicked()), this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

 m_sigmapper->setMapping(pCheckBox, (monTab,ligne, pCheckBox));
 QObject::connect(m_sigmapper, SIGNAL(clicked()),this, SLOT(cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)));

QSignalMapperがどのように機能するか説明していただけますか?私は何を関連付けるのか本当にわかりません:(

11
Evans Belloeil

QSignalMapperクラスは、パラメーターのないシグナルのセットを収集し、シグナルを送信したオブジェクトに対応する整数、文字列、またはウィジェットのパラメーターを使用してそれらを再発行します。だからあなたは次のようなものを持つことができます:

_QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));
_

ボタンごとに、clicked()信号をQSignalMappermap()スロットに接続し、setMappingを使用してマッピングを追加してclicked()の場合にボタンから信号が送信されると、信号mapped(QWidget *)が発行されます。

_QPushButton * but = new QPushButton(this);

QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, but);
_

このように、ボタンをクリックするたびに、マッパーのmapped(QWidget *)シグナルが発行され、ウィジェットがパラメーターとして含まれます。

12
Nejat

まず、QSignalMapperがどのように機能するかを説明します。次に、なぜそれが必要ないのかを説明します。

QSignalMapperの仕組み:

S QSignalMapperを作成します。各チェックボックスに整数値を割り当てたいと仮定します。したがって、チェックボックスをクリックするたびに、整数値が割り当てられた信号を取得します。

マッパー信号をSLOTに接続します。これを実装します。

connect(mapper, SIGNAL(mapped(int)), this, SLOT(yourSlot(int)));

これで、整数引数を取るスロットを書くことができます。引数は、チェックボックスごとに異なります。

チェックボックスを作成するときは、チェックボックスごとに次のことを行う必要があります。

mapper->setMapping(checkBox, integerValueForThisCheckbox);
connect(checkBox, SIGNAL(clicked()), mapper, SLOT(map()));

これ以降、チェックボックスをクリックするたびに、clicked()シグナルがQSignalMapperに送信され、割り当てられた整数値にマップされてmapped()が送信されます。信号。そのmapped()シグナルに接続したので、yourSlot(int)は適切な整数値で呼び出されます。

整数の代わりに、QStringQWidget*、またはQObject*を割り当てることができます(Qtのドキュメントを参照)。

これがQSignalMapperの仕組みです。

あなたはそれを必要としない:

  • QTableWidget *monTabは単一のオブジェクトであり、変更されません。クラスメンバーフィールドとして保持し、スロット関数から使用します。
  • QCheckBox *pCheckBox- sender()QCheckBox*にキャストすることで取得できます。

このような:

void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;
}

sender()関数はQObjectからのものであり、継承元であるため、アクセスできます。

  • int linge(行番号ですよね?)-チェックボックスを作成するとき、そのチェックボックスへのポインタをQListクラスフィールドに格納し、スロット関数からそれを使用して、どの行であるかを確認できます。 、 このような:

クラス宣言の場合:

private:
    QList<QCheckBox*> checkboxes;

チェックボックスを作成する場合:

QCheckBox* cb = new QCheckBox();
checkboxes << cb;

スロット機能の場合:

void supervision::yourSlot()
{
    QCheckBox* pCheckBox = qobject_cast<QCheckBox*>(sender());
    if (!pCheckBox) // this is just a safety check
        return;

    int linge = checkboxes.indexOf(pCheckBox);
}

必要に応じて、そのQListをスキップしてQSignalMapperを使用し、マッパーを使用してチェックボックスに行を割り当てることができます。それはあなたが何を好むかという問題です。

9
Googie