0

作成したクラスの QList を受け取る関数があります。この架空のクラスを「Stuff」と呼びましょう。したがって、この関数は Stuff の QList を受け取ります

QList を反復処理し、"Stuff" オブジェクトのプロパティに応じて、次のいずれかを生成します。

1) QLineEdit

2) QCheckBox

3) QComboBox

これは実際のコードではありませんが、これは私が本質的にやっていることです:

void MyProgram::update(QList<Stuff> myStuffs)
{
  this->mSignalMapper = new QSignalMapper();

  foreach (Stuff stuff, myStuffs)
  {
    if (stuff.isInt())
    {
      QLineEdit* input = new QLineEdit();
      //There is code here to setup the QLineEdit and fill an initial value
      verticalLayout->addWidget(input); //verticalLayout is QVBoxLayout
      QObject::connect(input, SIGNAL(editingFinished()), this->mSignalMapper, SLOT(map()));
      this->mSignalMapper->setMapping(input, stuff.getMappingId());
      /*
       * NOTE: the stuff.getMappingId() function returns an int that is unique
       * to that stuff object.  I'm 100% sure each stuff object is getting
       * a unique mapping ID */
      QObject::connect(this->mSignalMapper, SIGNAL(mapped(int)), this, SLOT(onStuffChanged(int)));
    }
    else if (stuff.isBool())
    {
      QCheckBox* input = new QCheckBox();
      //There is code here to setup the QCheckBox and set an initial value
      verticalLayout->addWidget(input);
      QObject::connect(input, SIGNAL(stateChanged(int)), this->mSignalMapper, SLOT(map()));
      this->mSignalMapper->setMapping(input, stuff.getMappingId());
      QObject::connect(this->mSignalMapper, SIGNAL(mapped(int)), this, SLOT(onStuffChanged(int)));
    }
    else if (stuff.isStringList())
    {
      QComboBox* input = new QComboBox();
      //There is code here to setup the QComboBox and fill in values for the combo box
      verticalLayout->addWidget(input);
      QObject::connect(input, SIGNAL(activated(int)), this->mSignalMapper, SLOT(map()));
      this->mSignalMapper->setMapping(input, stuff.getMappingId());
      QObject::connect(this->mSignalMapper, SIGNAL(mapped(int)), this, SLOT(onStuffChanged(int)));
    }
  }
}

問題は、QLineEdit を編集するか、チェック ボックスをオンにするか、コンボ ボックスの値を変更して、ウィジェットのシグナルの 1 つだけをトリガーすると、onStuffChanged(int) 関数が N 回呼び出されることです。ここで、N = の数です。 mSignalMapper のマッピング。

何が起きてる?ループして 10 個のウィジェットを作成すると、10 個のウィジェットのうち 1 つだけをクリックすると、関数が 10 回呼び出され、その 10 回のそれぞれで、操作した 1 つのオブジェクトのみに関連付けられた一意の int が渡されます。したがって、10 個のウィジェットのうちの 1 番目が、一意の int ID が 27 のチェックボックスであった場合、onStuffChanged(int) 関数は、毎回 27 のパラメータで 10 回呼び出されます。

4

1 に答える 1

2

問題は次の行です。

QObject::connect(this->mSignalMapper, SIGNAL(mapped(int)), this, SLOT(onStuffChanged(int)));

同じ接続をN回 ( N = 「スタッフ」カウント) 行っているため、すべての信号がスロットをNmapped()トリガーします。onStuffChanged(int)

解決策: この行をループの外に移動して、一度だけ呼び出されるようにします。

于 2016-02-04T08:52:09.340 に答える