Если у меня есть класс, который объявляет сигнал Qt:
class Test
{
signals:
void TestSignal();
}
Это прекрасно работает в Qt. Но Resharper C ++ дает мне предупреждение:
Function 'void Test::TestSignal()' is not implemented
Это правильно, но бессмысленно, поскольку Qt не хочет, чтобы функция была реализована. Есть ли способ реализовать это signal
чтобы Решарпер не жаловался?
Я старался:
class Test
{
signals:
void TestSignal() = {};
}
но получите ошибку сборки:
ошибка: не объявление сигнала
Как объяснил AcerExtensa, инструмент MOC генерирует реализации сигналов Qt. Чтобы отключить предупреждение, вы можете включить сгенерированные исходные файлы в ваше решение, чтобы ReSharper видел реализации сигналов в вашем заголовке. Вы правы, хотя это предупреждение бесполезно, я подал https://youtrack.jetbrains.com/issue/RSCPP-20044 чтобы отключить проверку «Функция не реализована» для сигналов Qt.
Qt не хочет, чтобы функция была реализована
Это утверждение неверно. Qt — это Framework, а не Language. Если вы не определите свою функцию, вы получите ошибку от компилятора.
Qt имеет инструмент под названием MOC (Meta Object Compiler). MOC является генератором кода. Он анализирует заголовочные файлы и генерирует дополнительный файл C ++, который компилируется с остальной частью программы. Этот сгенерированный файл C ++ содержит всю информацию, необходимую для самоанализа (механизм сигналов / слотов).
Таким образом, чтобы ваш код работал, вам нужно в первую очередь включить Q_OBJECT
Def в вашем классе, и ваш класс должен наследовать от QObject
или один из его подклассов (например, QWidget
) так что Qt может использовать его QMetaObject
«S. Если ваш компилятор или лучше сказать, что ваш DevEnv не знает, как генерировать файлы moc, вам нужно сделать это самостоятельно, а затем включить moc
файл в исходном дереве вашего проекта или включить его непосредственно в конец исходного файла, например:
#include "yoursourcefilename.moc"
Вы можете прочитать больше о системе Qt Meta Object здесь: Метаобъектная система