Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
1

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

04.07.2015, 14:57. Показов 3121. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как можно соединить "неизвестный" сигнал со слотом, у которого все принимаемые параметры - QVariant?

Есть такая функция:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
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() так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
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) {
             /* ... */
    }
а функцию для создания соединений так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
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) выдаст следующее предупреждение в рантайме:
C++ (Qt)
1
QObject::connect: No such slot ::phpslot(bool)

Такой вариант:
C++ (Qt)
1
connect(sender, signal, this, SLOT(phpslot(QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant,QVariant)));
вообще не создает никаких связок и выдает такое предупреждение:
C++ (Qt)
1
QObject::connect: Incompatible sender/receiver arguments

а такой:
C++ (Qt)
1
connect(sender, signal, this, &phpslot);
даже не компилируется с ошибкой:
C++ (Qt)
1
2
3
ошибка: 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);
                                               ^
есть у кого-нить идеи как правильно создать связь сигнал-слот для такого случая? =)

Добавлено через 11 минут
Еще была идея просто получить список переданных аргументов из сигнала, и вызвать нужный слот с этими аргументами, но я не нагуглил как можно такое провернуть.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2015, 14:57
Ответы с готовыми решениями:

Ошибки в файле moc при попытке соединить сигнал со слотом
Пытаюсь соединить сигнал со слотом. В основном выводе пишет QObject::connect: No such signal...

Как соединить сигнал класса MainWindow openFile c слотом класса MainController openFile?
класс главного окна class MainWindow : public QMainWindow { Q_OBJECT public: ...

Как QAction соединить со слотом?
Как QAction соединить со слотом? И можно ли создать QActionGroup и соединить его с одним слотом в...

Как связать сигнал QListWidget со слотом QTextEdit ?
В виджете QListWidget есть список элементов из QMap::key(), в виджете QTextEdit хочу получать...

Не конектится сигнал со слотом
у меня есть слот void MainWindow::comboSelectItem(int b) { } я его связываю с сигналом ...

24
66 / 66 / 18
Регистрация: 31.03.2015
Сообщений: 253
07.07.2015, 10:14 21
Author24 — интернет-сервис помощи студентам
Что мешает емитировать сигнал не с множеством параметров неизвестного типа, а с единственным параметром типа QVariant? А вот уже в этот параметр вы можете запихнуть что угодно и в любом количестве.
В этом случае проблем в соединении сигнала/слота не возникнет.
Правда возникнут проблемы в самом слоте (как допереть, что на самом деле в аргументе спрятано ). Но это уже забота разработчика.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
07.07.2015, 10:23  [ТС] 22
Цитата Сообщение от yarko Посмотреть сообщение
как допереть, что на самом деле в аргументе спрятано
для этого есть QVariant::type()

но я еще раз повторю: вариант переписывать стандартные сигналы и заменять их на свои - не совсем вариант но если и дальше придется под каждый сигнал писать if(signalName == "..."), то, наверное, буду переписывать... в любом случае мне уже пришлось делать обертки над виджетами, чтобы все их методы сделать Q_INVOKABLE для доступа к ним через invokeMethod
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.07.2015, 10:57 23
Просто не нужно маяться фигней и изобретать полускриптовые-велосипеды, есть PyQt который нормально работает.
0
Мотороллер
07.07.2015, 15:35
  #24

Не по теме:

Avazart, а что ТС ваяет?

0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
07.07.2015, 15:51  [ТС] 25
Цитата Сообщение от Мотороллер Посмотреть сообщение
а что ТС ваяет?

Не по теме:

Форум
Проект

0
07.07.2015, 15:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2015, 15:51
Помогаю со студенческими работами здесь

Сигнал не коннектится со слотом
Всем привет. Начал изучать Qt, решил опробовать механизм сигналов и слотов: #include <QtCore>...

Связать сигнал еще не существующего объекта со слотом
connect(progress, SIGNAL(close()), SLOT(showHidden()));В конструкторе MainWindow хочу связать...

Программа неожиданно завершилась. Когда соединяю сигнал со слотом
В конструкторе прописал: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...

Законнектить сигнал элемента контейнера, на который установлен и итератор со слотом
Есть контейнер QList<QTcpSocket*> list итератор QMutableListIterator<QTcpSocket> i i...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...

Как соединить сигнал от формы с классом
Здравствуйте, не могу соединить сигнал от формы с внешним классом. Задача простая - передать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru