Per completezza, ecco un'estensione della risposta di @ hank. I fornire sei connect
funzioni -come:
connect_from_pointer
prende un QSharedPointer come primo argomento e la solita QObject *
come terzo argomento.
connect_to_pointer
prende il solito QObject *
come primo argomento e un QSharedPointer come terzo argomento.
connect_pointers
utilizza QSharedPointers per entrambi i parametri.
Ci sono due versioni di ciascuno di questi: uno che accetta la sintassi SIGNAL()
/SLOT()
e uno che accetta le (consigliato) puntatori a funzione.
Questi sono sintatticamente atroci, ma questo è un modello per te.
template<class T>
QMetaObject::Connection connect_from_pointer(
const QSharedPointer<T>& sender,
const char *signal,
const QObject *receiver,
const char *method,
Qt::ConnectionType type = Qt::AutoConnection)
{
return QObject::connect(sender.data(), signal, receiver, method, type);
}
template <typename Func1, typename Func2>
QMetaObject::Connection connect_from_pointer(
const QSharedPointer<typename QtPrivate::FunctionPointer<Func1>::Object>& sender,
Func1 signal,
const typename QtPrivate::FunctionPointer<Func2>::Object *receiver,
Func2 slot,
Qt::ConnectionType type = Qt::AutoConnection)
{
return QObject::connect(sender.data(), signal, receiver, slot, type);
}
template<class T>
QMetaObject::Connection connect_to_pointer(
const QObject *sender,
const char *signal,
const QSharedPointer<T>& receiver,
const char *method,
Qt::ConnectionType type = Qt::AutoConnection)
{
return QObject::connect(sender, signal, receiver.data(), method, type);
}
template <typename Func1, typename Func2>
QMetaObject::Connection connect_to_pointer(
const typename QtPrivate::FunctionPointer<Func1>::Object *sender,
Func1 signal,
const QSharedPointer<typename QtPrivate::FunctionPointer<Func2>::Object>& receiver,
Func2 slot,
Qt::ConnectionType type = Qt::AutoConnection)
{
return QObject::connect(sender, signal, receiver.data(), slot, type);
}
template<class T, class U>
QMetaObject::Connection connect_pointers(
const QSharedPointer<T>& sender,
const char *signal,
const QSharedPointer<U>& receiver,
const char *method,
Qt::ConnectionType type = Qt::AutoConnection)
{
return QObject::connect(sender.data(), signal, receiver.data(), method, type);
}
template <typename Func1, typename Func2>
QMetaObject::Connection connect_pointers(
const QSharedPointer<typename QtPrivate::FunctionPointer<Func1>::Object>& sender,
Func1 signal,
const QSharedPointer<typename QtPrivate::FunctionPointer<Func2>::Object>& receiver,
Func2 slot,
Qt::ConnectionType type = Qt::AutoConnection)
{
return QObject::connect(sender.data(), signal, receiver.data(), slot, type);
}
Questo è interessante, non sapevo che potessi farlo. Tuttavia, non penso che migliori l'originale. È molto più ordinato usare QMetaData/qRegisterMetaType dato che questo è esattamente il motivo del meccanismo:), in più mantieni il tuo auto completo :)) –
Suppongo che l'OP non abbia chiesto come inviare oggetti 'QSharedPointer' tramite lo slot del segnale meccanismo (in questo caso si dovrebbe usare 'qRegisterMetaType') ma come passare un oggetto' QSharedPointer' alla funzione 'connect'. – hank
Ma "Come inviare QSharedPointer tramite lo slot del segnale" e "come passare un oggetto QSharedPointer alla funzione di connessione" ... sono praticamente la stessa cosa poiché il collegamento fa parte del meccanismo dello slot del segnale. Ma comunque, mi piace molto quello che hai fatto, è fuori dagli schemi, ma stavo solo sottolineando che non è il modo migliore (forse solo secondo me). –