К сожалению, соединение сигнал-слот Qt не принимает никаких аргументов для передачи в слот при вызове сигнала. Это работает только в том случае, если сам сигнал предоставляет эти аргументы, но вы не можете добавить их в оператор connect
.
Но вы не единственный, кто хочет это сделать, поэтому в Qt есть класс, который делает почти то, что вы хотите: QSignalMapper
. Экземпляр этого класса можно использовать в качестве «прокси» для соединения сигнал-слот: вы подключаете (несколько) кнопок к слоту этого класса и подключаете сигнал этого класса к вашему целевому слоту. Затем для каждого экземпляра «отправителя» (в вашем случае кнопки) вы можете указать классу, какое значение добавить в вызываемый слот. Пример:
QPushButton * button1 = ...;
QPushButton * button2 = ...;
QSignalMapper mapper;
connect(button1, SIGNAL(released()), &mapper, SLOT(map()));
mapper.setMapping(button1, 42); // Number to be passed in the slot
connect(button2, SIGNAL(released()), &mapper, SLOT(map()));
mapper.setMapping(button2, 1337); // Number to be passed in the slot
connect(&mapper, SIGNAL(mapped(int)), this, SLOT(handleButton(int)));
К сожалению, как видите, этот класс может обрабатывать только один параметр. В вашем случае вам следует выбрать другой метод (я объяснил выше на случай, если вы снова столкнетесь с похожей проблемой, но с одним параметром int
).
Альтернативой, которая подходит для вашей проблемы, является использование sender()
в слоте. Помните свое сопоставление в структуре данных, например
QMap<QObject*,int> rows;
QMap<QObject*,int> cols;
и получить доступ к тем в вашем слоте, которые не принимают никаких аргументов:
void fieldWindow::handleButton(){
int row = rows[sender()];
int col = cols[sender()];
cout << row << " " << col << endl;
}
Конечно, при инициализации вашего пользовательского интерфейса вам необходимо указать соответствующие значения в этих картах. Или вы можете найти свою кнопку в существующем массиве buttonsField
.
Еще один метод существует со времен Qt5 и C++11: вместо слота вы можете обрабатывать сигналы в лямбда-функции. Это будет выглядеть так (сигнал назван с использованием нового синтаксиса):
connect(this->buttonsField[i][j], &QPushButton::released, [=]{
handleButton(i, j);
});
Если вам не нравится синтаксис лямбда, вы также можете использовать некоторые помощники из стандартной библиотеки для составления функтора вместо лямбда, или вы можете написать свой собственный класс функтора, но лично я нахожу лямбду очень читабельной.
person
leemes
schedule
16.01.2014
connect
не принимает никаких аргументов в выраженииSIGNAL(...)
.SIGNAL
— это макрос, который инкапсулирует функцию signature в строку, которая будет переданаconnect
. - person leemes   schedule 16.01.2014handleButton(int,int)
?! Но как мне тогда передать аргументы?! - person Bankin   schedule 16.01.2014