общий метод cpp для создания QObject::подключение

#c #qt #qobject

Вопрос:

я хочу написать ConnectMathod(…) таким образом, чтобы он принимал QObject* и слот приемника. и установить соединение

 class A : public QObject {
public :
A();
~A();
signals :
void sigA(int);
slots :
void slotA(bool);
}
 
 class B : public QObject {
public :
B();
~B();
signals :
void sigB(bool);
slots :
void slotB(int);
}
 

// класс C : я хочу написать общий математический метод, который ожидает приемник (QObject*) и слот

 class C : public QObject
{
public :
C();
~C();
signals :
void signalC(bool);

// i want help to write ConnectMathod
QMetaObject::Connection ConnectMathod(QObject* receiverObject, functionPointer)
{
QMetaObject::Connection = QObject::connect(this, amp;C::signalC, receiverObject, functionPointer);
return connection;
}
}
 

/////// main.cpp ///////

 main()
{
A objA = new A();
B objB = new B();
C objC = new C();
QMetaObject::Connection connection = objC->ConnectMathod(objA, objA->slotA);
connection = objC->ConnectMathod(objB, objB->slotB);
}

 

Комментарии:

1. С какой частью у тебя проблемы?

2. @JarMan // мне нужна помощь в написании метода подключения правильным способом QMetaObject::Метод подключения соединения(QObject* receiverObject, указатель функций) { QMetaObject::Соединение = QObject::подключение(это, amp;C::Сигнал, объект получателя, указатель функций); вернуть соединение; }

3. Вы получаете сообщение об ошибке?

4. @JarMan только его псевдокод (не поддающийся сборке код), как написать ConnectMathod.?

Ответ №1:

Сделайте ConnectMethod как шаблон функции, который принимает в качестве второго аргумента параметр шаблона, который будет любым вызываемым объектом, например замыканием, сгенерированным из лямбда-выражения:

 class C : public QObject {
    Q_OBJECT
public:
C() {}
~C() {}
signals:
    void signalC(bool);
public:
    template<class Callable>
    QMetaObject::Connection ConnectMathod(QObject* contextObj, Callable cb) 
    {
        return connect(this, amp;C::signalC, contextObj, cb);
    }
};

A* a = new A();
B* b = new B();
C* c = new C();
c->ConnectMathod(a, [a](bool){ a->slotA(true); });
c->ConnectMathod(b, [b](bool){ b->slotB(10);});
c->signalC(true);