Attaching signals and slots to an object within a QSharedPointer

前端 未结 2 1686
暖寄归人
暖寄归人 2021-02-14 16:14

My application contained several functions like this:

void SomeClass::set_data_provider(DataProvider *data_provider)
{
    connect(data_provider, SIGNAL(data_ava         


        
相关标签:
2条回答
  • 2021-02-14 16:55

    You can create a custom connect function:

    template<class T> bool
    my_connect(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);
    }
    

    And use it like this:

    QSharedPointer<MyObject> shared(new MyObject);
    my_connect(shared, SIGNAL(my_signal()), this, SLOT(my_slot()));
    

    The only problem is that in both yours and mine solutions you will lose Qt Creator autocomplete for the native connect function.

    P.S. As for me, I wouldn't change your code. I think it's fine :)

    0 讨论(0)
  • 2021-02-14 16:56

    For completeness, here is an extension of @hank’s answer. I provide six connect-like functions:

    • connect_from_pointer takes a QSharedPointer as its first argument and the usual QObject * as its third argument.
    • connect_to_pointer takes the usual QObject * as its first argument and a QSharedPointer as its third argument.
    • connect_pointers takes QSharedPointers for both parameters.

    There are two versions of each of these: one that accepts the SIGNAL()/SLOT() syntax and one that accepts the (recommended) function pointers.

    These are syntactically atrocious, but that’s templates for you.

    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);
    }
    
    0 讨论(0)
提交回复
热议问题