Der Vollständigkeit halber ist hier eine Erweiterung von @ Hank's Antwort. Ich biete sechs connect
-ähnliche Funktionen:
connect_from_pointer
nimmt QSharedPointer als erstes Argument und den üblichen QObject *
als drittes Argument.
connect_to_pointer
nimmt das übliche QObject *
als sein erstes Argument und einen QSharedPointer als sein drittes Argument.
connect_pointers
übernimmt QSharedPointers für beide Parameter.
Es gibt zwei Versionen von jedem dieser: eine, die die SIGNAL()
/SLOT()
Syntax und man akzeptiert, dass die (empfohlen) Funktionszeiger akzeptiert.
Diese sind syntaktisch grauenhaft, aber das ist Vorlagen für Sie.
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);
}
Das ist interessant, ich wusste nicht, dass Sie das tun könnten. Ich glaube jedoch nicht, dass es das Original verbessert. Es ist viel aufgeräumter, QMetaData/qRegisterMetaType zu verwenden, da dies genau der Grund für den Mechanismus ist:), und Sie behalten auch Ihre Auto-Vollendung :)) –
Ich nehme an, das OP fragte nicht, wie man 'QSharedPointer'-Objekte über Signal-Slot sendet Mechanismus (in diesem Fall sollte 'qRegisterMetaType' wirklich verwendet werden), aber wie ein' QSharedPointer'-Objekt an die 'connect'-Funktion übergeben wird. – hank
Aber "wie QSharedPointer über Signal-Slot zu senden" und "wie ein QSharedPointer-Objekt an die Verbindungsfunktion übergeben" .... sind im Grunde die gleiche Sache, da connect Teil des Signal-Slot-Mechanismus ist. Aber wie auch immer, ich mag das, was du getan hast, es ist außerhalb der Box, aber ich habe nur darauf hingewiesen, dass es nicht der beste Weg ist (vielleicht nur meiner Meinung nach). –