2015-03-23 3 views
4

В this question я был в состоянии адаптировать QObject методГде определена функция PointerToMemberFunction Qt?

QMetaObject::Connection 
QObject::connect(const QObject * sender, 
    const char * signal, 
    const QObject * receiver, 
    const char * method, 
    Qt::ConnectionType type = Qt::AutoConnection) 

в вариант, который принял QSharedPointer вместо того, QObject* в качестве первого параметра:

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) 

я хотел бы сделать то же самое вещь с версией, которая принимает указатели на функции,

QMetaObject::Connection 
QObject::connect(const QObject * sender, 
    PointerToMemberFunction signal, 
    const QObject * receiver, 
    PointerToMemberFunction method, 
    Qt::ConnectionType type = Qt::AutoConnection) 

но я не могу понять, что такое PointerToMemberFunction или где он определен! Что это за тип?

ответ

5

Это просто "сахар" для документации, истинное определение можно найти в qobject.h (исходный код Qt):

static QMetaObject::Connection connect(const QObject *sender, const char *signal, 
         const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection); 

    static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, 
         const QObject *receiver, const QMetaMethod &method, 
         Qt::ConnectionType type = Qt::AutoConnection); 

    inline QMetaObject::Connection connect(const QObject *sender, const char *signal, 
         const char *member, Qt::ConnectionType type = Qt::AutoConnection) const; 

#ifdef Q_QDOC 
    static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection); 
    static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor); 
    static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection); 
#else 
    //Connect a signal to a pointer to qobject member function 
    template <typename Func1, typename Func2> 
    static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, 
            const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot, 
            Qt::ConnectionType type = Qt::AutoConnection) 
    { 
     typedef QtPrivate::FunctionPointer<Func1> SignalType; 
     typedef QtPrivate::FunctionPointer<Func2> SlotType; 

     Q_STATIC_ASSERT_X(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value, 
          "No Q_OBJECT in the class with the signal"); 

     //compilation error if the arguments does not match. 
     Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount), 
          "The slot requires more arguments than the signal provides."); 
     Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value), 
          "Signal and slot arguments are not compatible."); 
     Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename SlotType::ReturnType, typename SignalType::ReturnType>::value), 
          "Return type of the slot is not compatible with the return type of the signal."); 

     const int *types = 0; 
     if (type == Qt::QueuedConnection || type == Qt::BlockingQueuedConnection) 
      types = QtPrivate::ConnectionTypes<typename SignalType::Arguments>::types(); 

     return connectImpl(sender, reinterpret_cast<void **>(&signal), 
          receiver, reinterpret_cast<void **>(&slot), 
          new QtPrivate::QSlotObject<Func2, typename QtPrivate::List_Left<typename SignalType::Arguments, SlotType::ArgumentCount>::Value, 
              typename SignalType::ReturnType>(slot), 
          type, types, &SignalType::Object::staticMetaObject); 
    }