Как я могу проверить соединение сигнала / слота во время компиляции? - PullRequest
9 голосов
/ 03 января 2012

Проверка вызовов в слоте Qt connect во время выполнения - это проблема для меня.Я должен иметь возможность выполнять статическую проверку операторов соединения.

Существует ли такой инструмент?

Ответы [ 6 ]

5 голосов
/ 15 октября 2014

Используя QT5, вы можете использовать следующий синтаксис, который статически проверяется во время компиляции:

connect(sender, &Sender::signalMethod,  receiver, &Receiver::slotMethod);
3 голосов
/ 03 января 2012

Существует ли такой инструмент?

Было бы неплохо, если бы такой инструмент существовал, но, к сожалению, его нет, потому что механизм сигнала / слота реализован вкварты.Кроме того, по этой причине невозможно статически проверить, соответствует ли сигнал слоту.

Если бы qt использовал что-то вроде сигнала / слотов повышения, это было бы возможно.

2 голосов
/ 04 января 2012

Я использовал что-то вроде этого в моем коде:

  #define CONNECT_OR_DIE(source, signal, receiver, slot,connection_type) \
    if(!connect(source, signal, receiver, slot,connection_type)) \
       qt_assert_x(Q_FUNC_INFO, "CONNECT failed!!", __FILE__, __LINE__);

Я использовал его вместо простого вызова connect (). Это тебе поможет ??

2 голосов
/ 03 января 2012

Вы можете рассмотреть возможность создания плагина GCC на C или расширения MELT , MELT - это предметно-ориентированный язык для простого кодирования расширений GCC. С помощью плагинов или расширений MELT вы можете проанализировать внутренние представления (в частности, Tree-s, представляющие объявления классов и функций C ++) и создать для этого специальный инструмент.

Однако расширение GCC требует понимания его довольно сложного внутреннего представительства и потребует более недели усилий для человека, не знающего внутреннюю часть GCC.

Возможно, такие усилия не стоят, если ваше приложение Qt не очень большое. Если вы решите поработать с MELT, я был бы рад помочь вам.

1 голос
/ 12 ноября 2015

Для работы с большой кодовой базой Qt4 я написал такой плагин как плагин для лязг статического анализатора

См: http://reviews.llvm.org/D14592

пример этого теста покрытия:

    connect(&send, SIGNAL(f2(int, double*)), &recv, SLOT(bugaga(int, double*))); // expected-warning{{Can not find such slot}}
1 голос
/ 03 января 2012

Вы не можете проверить это во время компиляции, но если вы запустите программу в режиме отладки внутри Qt Creator, она выведет полезное диагностическое сообщение на панели Application Ouptut, если вызов connect не удастся. Смотри мой ответ здесь .

...