Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Реализация сигналов и слотов в своём классе

#cpp #qt #qt5


Начал изучать Qt по книге М.Шлее и дошёл до сигналов и слотов, сам механизм понятен.
Попробовал написать простой класс реализующий этот механизм, но Qt Creator выводит
похожие ошибки  


  .../Error in " Util.asciify("build-...-Debug")":-1: error: TypeError:
  Property 'asciify' of object
  Core::Internal::UtilsJsExtension(0x155bb00) is not a
  function/.../tests.cpp:19: undefined reference to
  `SS_Primer::introduce_yourself()'


Класс компилируется

class SS_primer : public QObject {
        Q_OBJECT
    public:
        void send_signal() { emit introduce_yourself(); }
    public slots:
        void show_name() { std::cout << "I'm a slot" << std::endl; }
    signals:
        void introduce_yourself();
};


А этот код не хочет(

bool Test::SignalSlot() {
    SS_primer primer;
    QObject::connect( &primer, SIGNAL(introduce_yourself()), &primer, SLOT(show_name()) );
    primer.send_signal();
    return true;
}


Пробовал создавать объект класса через new, делал send_signal() static функцией принимающей
указатель. 
    


Ответы

Ответ 1



Вангую: Вы сделали все это дело в одном файле, не так ли? Вам следовало повнимательнее почитать Шлее, иначе бы Вы были бы вкурсе, что такое и, главное, как работает метакомпилятор. Короче разнести объявление и реализацию как положено и все заработает. PS Эти ошибки выводит не мифический Qt, а линкер - он вам прямо говорит, что не может найти ваш сигнал. Его действительно нет - можете даже создать динамическую библиотеку и проверить nm-ом. Это из-за того, что moc не отработал. PSS используйте новый синтаксис сигналов-слотов - он гораздо удобнее (за исключением перегруженный слотов) и при ошибках, связанных с неправильным подключением, вы получите больше корректной информации.

Комментариев нет:

Отправить комментарий