#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);