ここに私の投稿の後: シグナルとスロットを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
がどのように機能するか説明していただけますか?私は何を関連付けるのか本当にわかりません:(
QSignalMapper
クラスは、パラメーターのないシグナルのセットを収集し、シグナルを送信したオブジェクトに対応する整数、文字列、またはウィジェットのパラメーターを使用してそれらを再発行します。だからあなたは次のようなものを持つことができます:
_QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(mySlot(QWidget *)));
_
ボタンごとに、clicked()
信号をQSignalMapper
のmap()
スロットに接続し、setMappingを使用してマッピングを追加してclicked()
の場合にボタンから信号が送信されると、信号mapped(QWidget *)
が発行されます。
_QPushButton * but = new QPushButton(this);
QObject::connect(but, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(but, but);
_
このように、ボタンをクリックするたびに、マッパーのmapped(QWidget *)
シグナルが発行され、ウィジェットがパラメーターとして含まれます。
まず、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)
は適切な整数値で呼び出されます。
整数の代わりに、QString
、QWidget*
、または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
を使用し、マッパーを使用してチェックボックスに行を割り当てることができます。それはあなたが何を好むかという問題です。