Как можно соединить "неизвестный" сигнал со слотом, у которого все принимаемые параметры -
QVariant?
Есть такая функция:
void createConnection(QWidget *sender, char *signal, zval *receiver, char *slot) {
/*
* тут я заношу в массив отправителя сигнала,
* сигнатуру сигнала,
* обработчика сигнала
* и сигнатуру слота, чтобы потом обращаться к ним
*/
// дальше мне нужно законнектить сигнал со слотом
// сначала у меня было так:
connect(sender, signal, this, SLOT(phpslot()));
}
char *signal - выглядит примерно так:
1clicked(),
char *slot - тоже.
функция
phpslot() находит нужный
receiver из списка и вызывает соответствующий слот, но таким образом я не могу передавать в слот
receiver'a параметры, потому что функция
phpslot() ничего не принимает... тогда я попробовал переписать функцию
phpslot() так:
public slots:
void phpslot(const QVariant &v0 = NULL,
const QVariant &v1 = NULL,
const QVariant &v2 = NULL,
const QVariant &v3 = NULL,
const QVariant &v4 = NULL,
const QVariant &v5 = NULL,
const QVariant &v6 = NULL,
const QVariant &v7 = NULL,
const QVariant &v8 = NULL,
const QVariant &v9 = NULL) {
/* ... */
}
а функцию для создания соединений так:
void createConnection(QWidget *sender, char *signal, zval *receiver, char *slot) {
/*
*/
QString sslot = QString(slot);
QString phpqt_slot = "1phpslot" + sslot.mid(sslot.indexOf("("), sslot.indexOf(")")); // типа создаю сигнатуру функции php_slot()
// например, если слот пришел таким: "1update(int, int, int)", то он тупо превратится в "1phpslot(int, int, int)"
connect(sender, signal, this, php_slot);
}
Теперь когда я пытаюсь законнектить сигнал со слотом, удачно отрабатывают только сигналы, не передающин никаких параметров. Ну, например, сигнал clicked() и слот mySomeSlot() создадут "связку", а вот попытка связать сигнал clicked(bool) с mySomeSlot(bool) выдаст следующее предупреждение в рантайме:
QObject::connect: No such slot ::phpslot(bool)
Такой вариант:
connect(sender, signal, this, SLOT(phpslot(QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant)));
вообще не создает никаких связок и выдает такое предупреждение:
QObject::connect: Incompatible sender/receiver arguments
При чем предупреждение не изменится, даже если вместо всей кучи QVariant'ов в phpslot(...) будет передано только нужное количество параметров, например один.
а такой:
connect(sender, signal, this, &phpslot);
даже не компилируется с ошибкой:
ошибка: no matching function for call to 'Phpqt5::connect(PQWidget*&, char*&, Phpqt5*, void (Phpqt5::*)(const QVariant&, const QVariant&, const QVariant&, const QVariant&, const QVariant&, const QVariant&, const QVariant&, const QVariant&, const QVariant&, const QVariant&))'
connect(sender, signal, this, &phpslot);
как правильно создать связь сигнал-слот для такого случая? =)
P.s. Еще была идея просто получить список переданных аргументов из сигнала, и вызвать нужный слот с этими аргументами, но я не нагуглил как можно такое провернуть.