Вы можете сделать это с QSignalMapper
(см. Пример там для использования) с некоторыми ограничениями, но вы должны быть очень осторожны с временем жизни объекта.
QSignalMapper *signalMapper = new QSignalMapper(this);
MyClass *myVar = new ...;
QPushButton *button = new QPushButton(this);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, myVar);
connect(signalMapper, SIGNAL(mapped(MyClass*)),
this, SIGNAL(MySlot(MyClass*)));
(Обратите внимание, что MyClass
должно быть получено из QObject
или QWidget
.)
Это будет работать до тех пор, пока объект, на который указывает myVar
, остается действительным (то есть не удаляется), но если вы не сохраните указатель на этот объект где-либо, вы не сможете его легко удалить. - чтобы у вас могла быть утечка памяти. (Если вы держитесь за отображение сигнала и указатель кнопки, вы можете восстановить этот объект с помощью mapping
члена QSignalMapper
.)
С другой стороны, следующий не будет работать :
QSignalMapper *signalMapper = new QSignalMapper(this);
MyClass myVar;
...
signalMapper->setMapping(button, &myVar); // WRONG
...
Это не может работать, потому что в этом случае объект, на который ссылается myVar
, уничтожается, когда заканчивается someFunction
, поэтому слот получит недопустимый указатель, что приведет к неопределенному поведению (то есть может произойти что угодно - ошибка, сбой, вещи, кажущиеся работающими, иногда не другие, ...).