Меньше подключений в калькуляторе Qt - PullRequest
0 голосов
/ 05 февраля 2010

Я пишу упрощенный калькулятор, использующий Qt с C ++, для целей обучения. Каждый номер - это QPushButton, который использует один и тот же слот для изменения текста в виджете lineEdit, используемом в качестве дисплея.

Слот использует метод sender (), чтобы выяснить, какая кнопка была нажата, поэтому правильное число будет записано на виджете дисплея.

Чтобы все кнопки работали, мне нужно написать соединение для каждой из них, вроде как:

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

Поскольку все они используют один и тот же слот, единственное, что меняется, - это используемая кнопка, поэтому следующим отправителем будет ui->button2, ui->button3 и т. Д. У меня вопрос, есть ли способ уменьшить количество определенных соединений?

Редактировать: Здесь - полезная ссылка, подробно обсуждающая эту проблему.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2010

Если вы используете QtDesigner или редактор форм QtCreator, вы можете просто перетаскивать строки между 2, и он заполнит код для вас.

Вы также можете сохранить все кнопки в структуре списка, но я бы использовал QVector, а не стандартный массив.

Возможно, вы захотите пересмотреть, используя метод sender(), это нарушает дизайн ООП. Вместо этого подключите все кнопки к QSignalMapper, а затем подключите mapped() к вашему текстовому полю.

2 голосов
/ 07 февраля 2010

В этом случае вы должны использовать 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 ОЧЕНЬ полезен, имейте это в виду;)

1 голос
/ 05 февраля 2010

Я думаю, вы можете попробовать выделить QPushButton в массиве, что-то вроде этого

QPushButton* numbers = new QPushButton[10];

А затем выполните соединения, используя цикл for

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

Но я не думаю, что это стоит. Явное соединение, хотя и делает код более подробным, делает соединения более понятными для читателя.

...