私はQLineEdit
s とQCheckBox
esを持っQVector
ています - 私はまたQPushButton
QVector
、要素が押されたときに対応するQLineEdit
andQCheckBox
も削除される a を持っています。
削除するインデックスを決定するためにどのボタンが押されたかを調べるにはどうすればよいですか? 現在、私はちょうどCheckbox
今 es を使用しています。これは簡単ですが、私の好みでは少しかさばります。
私はQLineEdit
s とQCheckBox
esを持っQVector
ています - 私はまたQPushButton
QVector
、要素が押されたときに対応するQLineEdit
andQCheckBox
も削除される a を持っています。
削除するインデックスを決定するためにどのボタンが押されたかを調べるにはどうすればよいですか? 現在、私はちょうどCheckbox
今 es を使用しています。これは簡単ですが、私の好みでは少しかさばります。
簡単な方法はQObject::sender()
、ボタン プレス スロットで使用して、どのボタンが信号を発したかを調べることです。次に、ボタンのベクトルを反復処理する必要があります。
QObject* obj = sender();
for(int i=0;i<buttonVector.count();i++)
{
if( obj == qobject_cast<QObject *>(buttonVector[i]))
{
...
}
}
QObject::setObjectName
1 つの回避策は、追加するボタンにいくつかの名前を使用して設定することです。
button.setObjectName(QString("%1").arg(i));
スロットでは、オブジェクト名を使用してボタン番号を取得できます。
void MainWindow::buttonClicked()
{
QPushButton *button = qobject_cast<QPushButton *>(QObject::sender());
int number = button->objectName().toInt();
}
もう 1 つの方法はQSignalMapper
、パラメーターなしのシグナルのセットを収集し、シグナルを送信したオブジェクトに対応する整数、文字列、またはウィジェット パラメーターを使用してそれらを再送信するクラスを使用することです。したがって、次のようなものを使用できます。
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(buttonClicked(int)));
ボタンを新しくするときclicked()
は、ボタンの信号を のmap()
スロットに接続し、QSignalMapper
を使用してマッピングを追加し、ボタンから信号が送信されsetMapping
たときclicked()
に信号が送信されるようにすることができますmapped(int)
。
button = new QPushButton();
QObject::connect(button, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(button, i);
このようにして、ボタンをクリックするたびにmapped(int)
、ボタン番号を含むマッパーのシグナルが発行され、その結果、ボタン番号buttonClicked
を含むパラメーターで呼び出されます。