0

学習目的で、C++でQtを使用して簡略化された計算機を作成しています。各番号は、同じスロットを使用して、表示として使用されているlineEditウィジェットのテキストを変更するQPushButtonです。

スロットはsender()メソッドを使用して、どのボタンが押されたかを判断するため、表示ウィジェットに正しい番号が書き込まれます。

すべてのボタンを機能させるには、次のように、各ボタンへの接続を作成する必要があります。

connect(ui->button1, SIGNAL(clicked()), this, SLOT(writeNum()));

それらはすべて同じスロットを使用するため、変更されるのは使用されているボタンだけです。したがって、次の送信者は、、ui->button2などui->button3になります。私の質問は、定義された接続の数を減らす方法はありますか?

編集:これは、この問題について詳細に説明している便利なリンクです。

4

3 に答える 3

2

QtDesignerまたはQtCreatorのフォームエディタを使用している場合は、2つの間に線をドラッグするだけで、コードが入力されます。

すべてのボタンをリスト構造に保持することもできますがQVector、標準の配列ではありません。

この方法の使用を再検討することもできますsender()。これはOOP設計に違反します。代わりに、すべてのボタンをに接続してから、テキストボックスに接続しますQSignalMappermapped()

于 2010-02-05T20:30:43.950 に答える
2

この場合、intを使用して、スロットに信号を送信したボタンを識別する必要があります。基本的に、そのタスクにはQSignalMapperを使用します。

QSignalMapper sm;

QPushButton* one = new QPushButton(this);
QPushButton* two = new QPushButton(this);
QPushButton* three = new QPushButton(this);
//and so on...

sm.setMapping(one, 1);
sm.setMapping(two, 2);
sm.setMapping(three, 3);
//and so on...

connect(one,  SIGNAL(clicked()), &sm, SLOT(map()));
connect(two,  SIGNAL(clicked()), &sm, SLOT(map()));
connect(three,  SIGNAL(clicked()), &sm, SLOT(map()));
//and so on...



connect(&sm, SIGNAL(mapped(int)), this, SLOT(yourslothere(int)));

注:QSignalMapperは非常に便利です。覚えておいてください;)

于 2010-02-06T22:20:54.950 に答える
1

QPushButtonを配列に割り当ててみることができると思います。

QPushButton* numbers = new QPushButton[10];

次に、forループを使用して接続を実行します

for(size_t i = 0; i < 9; ++i)
{
  connect(numbers[i],SIGNAL(clicked()),this,SLOT(writeNum()));
}

しかし、私はそれが価値があるとは思いません。明示的な接続は、コードをより冗長にする一方で、読者にとって接続をより明確にします。

于 2010-02-05T19:13:48.470 に答える