0

私はQLineEdits とQCheckBoxesを持っQVectorています - 私はまたQPushButton QVector、要素が押されたときに対応するQLineEditandQCheckBoxも削除される a を持っています。

削除するインデックスを決定するためにどのボタンが押されたかを調べるにはどうすればよいですか? 現在、私はちょうどCheckbox今 es を使用しています。これは簡単ですが、私の好みでは少しかさばります。

4

1 に答える 1

2

簡単な方法はQObject::sender()、ボタン プレス スロットで使用して、どのボタンが信号を発したかを調べることです。次に、ボタンのベクトルを反復処理する必要があります。

QObject* obj = sender();
for(int i=0;i<buttonVector.count();i++)
{
    if( obj == qobject_cast<QObject *>(buttonVector[i]))
    { 
      ...
    }
}

QObject::setObjectName1 つの回避策は、追加するボタンにいくつかの名前を使用して設定することです。

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を含むパラメーターで呼び出されます。

于 2015-06-03T05:16:18.850 に答える