Ваша проблема обычно решается с помощью QSignalMapper
, но он поддерживает только QString
, int
, QWidget*
и QObject*
в качестве типов параметров.
Если вы хотите использовать другие типы, вам нужно реализовать свой собственный преобразователь сигналов (не ненавидите ли вы, как Qt не позволяет создавать шаблоны классов, полученные из QObject
s? :), как это:
class PointSignalMapper : public QObject {
Q_OBJECT
public:
explicit PointSignalMapper( QObject * parent=0 )
: QObject( parent ), m_map() {}
void setMapping( QObject * sender, const Point & p ) {
if ( sender )
m_map[sender] = p;
}
public Q_SLOTS:
void map() {
map( sender() );
}
void map( QObject * sender ) {
if ( !sender )
return;
const QMap<QObject*,Point>::const_iterator
it = m_map.constFind( sender );
if ( it != m_map.constEnd() )
emit mapped( it.value() );
}
Q_SIGNALS:
void mapped( const Point & p );
private:
QMap<QObject*,Point> m_map;
};
Использование:
PointSignalMapper * mapper = new PointSignalMapper( this );
connect( mapper, SIGNAL(mapped(Point)), this, SLOT(pointDestroyed(Point)) );
mapper->setMapping( qObject1, point1 );
connect( qObject1, SIGNAL(timedout()), mapper, SLOT(map()) );
mapper->setMapping( qObject2, point2 );
connect( qObject2, SIGNAL(timedout()), mapper, SLOT(map()) );
// ...
В вашем конкретном случае:
Point p(a,b);
PointSignalMapper * mapper = new PointSignalMapper( this ); // added
mapper->setMapping( timer, p ); // added
connect( timer, SIGNAL(timedout()), mapper, SLOT(map()) ); // added
connect( mapper, SIGNAL(mapped(Point)), // modified
this, startDestruction(Point)) )