Как соединить сигнал с «неизвестными» аргументами со слотом в Qt?

Как можно соединить "неизвестный" сигнал со слотом, у которого все принимаемые параметры - 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. Еще была идея просто получить список переданных аргументов из сигнала, и вызвать нужный слот с этими аргументами, но я не нагуглил как можно такое провернуть.
  • Вопрос задан
  • 930 просмотров
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Посмотрите в сторону мета системы Qt, в частности на QMetaMethod (как соединять, как получать список параметров и пр.).
Ну и конечно же главный вопрос: какую задачу вы пытаетесь решить подобным образом? Возможно, это не совсем то что вам нужно)
Ответ написан
Zifix
@Zifix Куратор тега Qt
Barbatum
Я бы предложил попробовать новый синтаксис connect'a, там не требуется указывать параметры.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы