2

これは、ラベルの配列を作成する効率的な方法のフォローアップの質問です。

すべてグリッドレイアウトに追加されるコード (デザイナーではない) によって作成されたボタンの配列があります。私が欲しいのは、そのグリッドレイアウトの任意のボタンをクリックして、行と列をパラメーターとして同じ関数を呼び出すことができるようにすることです。これが必要な理由は、すべて同じことを行う 15x15 関数を書きたくないからです。

方法はありますか、または別の解決策を見つけようとする必要がありますか?

Ps。私の他のすべての入力は、「スロットに移動」を介してqtデザイナーで行われるため、そうでなければ発生する必要がある場合、その方法についてはわかりません。

編集: ラベルの配列はボタンの配列になりました。

4

2 に答える 2

2

すべてのボタンをパラメーターなしでスロットに接続し、次の手順で送信者の位置を取得できます。

  1. QObject送信者を QWidget にキャストするqobject_cast
  2. QWidgetを使用してそのインデックスを取得しますQLayout::indexOf(QWidget *widget)
  3. 次に、行、列、列スパン、および行スパンを取得しますQGridLayout::getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan)

サンプル コードは次のようになります。

void MyWidgetWithAllLabels::commonSlot() 
{
   QWidget *buttonWidget = qobject_cast<QWidget*>(sender());
   if (!buttonWidget)
      return;

   int indexOfButton = ui->gridLayout->indexOf(buttonWidget);
   int rowOfButton, columnOfButton, rowSpanOfButton, columnSpanOfButton;

   ui->gridLayout->getItemPosition(indexOfButton,
                                   &rowOfButton, &columnOfButton, &rowSpanOfButton, &columnSpanOfLabel);
    // Now you can get a reference to that specific QPushButton 
    QLayoutItem *item = ui->gridLayout->itemAtPosition(rowOfButton, columnOfButton);
    QPushButton *clickedButton = qobject_cast<QPushButton*>(item->widget());
    if (!clickedButton) 
        return;
    // ... do something with that clickedButton
}

関連する投稿のコードを参照すると、次のようにボタンをそのスロットに接続できます。

connect( ui->tile_0_0, SIGNAL(clicked()),
         this, SLOT(commonSlot()));
connect( ui->tile_0_1, SIGNAL(clicked()),
         this, SLOT(commonSlot()));
    // ...
于 2013-08-05T13:40:17.713 に答える