LINUX.ORG.RU

QT - не получается работать с сигналами

 , ,


0

1

Пробовал делать по учебнику QT работу с сигналами. Если я правильно понимаю, то для объявления сигналов и слотов нужно вставить слово Q_OBJECT в описании класса.

Пишу что-то вроде

class WatchThread : public QThread
{
public:
    WatchThread();

    void run();

    void get_event (int fd, const char * target);

     Q_OBJECT
signals:
     void writeInfo(char *info);
};

На что мне выдает:

watchthread.o:(.rodata._ZTV11WatchThread[_ZTV11WatchThread]+0x10): undefined reference to `WatchThread::metaObject() const' watchthread.o:(.rodata._ZTV11WatchThread[_ZTV11WatchThread]+0x18): undefined reference to `WatchThread::qt_metacast(char const*)' watchthread.o:(.rodata._ZTV11WatchThread[_ZTV11WatchThread]+0x20): undefined reference to `WatchThread::qt_metacall(QMetaObject::Call, int, void**)' collect2: error: ld returned 1 exit status

Подскажите пожалуйста, что я неправильно делаю?


ты не читал документацию Qt базовый вводный курс.

MikeDM ★★★★★
()

Пишу что-то вроде

Где пишешь? Небось в каком-нибудь .cpp файле?

anonymous
()
Ответ на: комментарий от Chaser_Andrey

Спасибо, исправил. Теперь выдает ошибку

main.cpp:(.text.startup+0x93): undefined reference to `vtable for WatchThread' main.cpp:(.text.startup+0xda): undefined reference to `vtable for WatchThread'

в коде

    QObject::connect(&thread, SIGNAL(writeInfo(char *)),
                          &w, SLOT(write_WatchInfo(char *)));

подскажите пожалуйста,что тут не так? Делал по http://www.doc.crossplatform.ru/qt/4.7.x/signalsandslots.html

Anath
() автор топика
Ответ на: комментарий от Anath

либо используй системы контроля версий, либо очисти вручную от всех лишних файлов типа Makefile и moc_ и прочих - когда ты меняешь в файлах Qt что-то вроде того что ты сейчас сделал - требуется «глубокая очистка»

лучше сохрани проект целиком куда-нибудь и экспериментируй

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

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Огромное Вам спасибо!!!! Все заработало после очистки от make и moc_* файлов.

Anath
() автор топика
Ответ на: комментарий от Chaser_Andrey
hannah@mars /tmp/q $ cat *
// main.cpp
#include "test.h"

int main() {
    WatchThread thread;
    return 0;
}
// test.cpp
#include "test.h"

WatchThread::WatchThread(): QThread() {}
void WatchThread::run() {}
// test.h
#include <QThread>

class WatchThread : public QThread
{
public:
    WatchThread();

    void run();

    void get_event (int fd, const char * target);
    Q_OBJECT

signals:
     void writeInfo(char *info);
};

hannah@mars /tmp/q $ qmake -project
hannah@mars /tmp/q $ qmake
hannah@mars /tmp/q $ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o test.o test.cpp
/usr/bin/moc-qt4 -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. test.h -o moc_test.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o moc_test.o moc_test.cpp
g++ -m64 -Wl,-O1 -o q main.o test.o moc_test.o    -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtCore -lpthread 
hannah@mars /tmp/q $ 

Q_OBJECT должен быть вначале описания класса

Что?

anonymous
()
Ответ на: комментарий от anonymous

The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.

А, блин, моя ошибка. «Q_OBJECT должен быть вначале описания класса» было написано в какой-то книге по Qt, наверное в Шлее.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Имхо «must» там несколько преувеличено. Просто если запихнуть в public, например, то все эти (а может даже и не все) дополнительные методы (qt_metacast, metaObject, ...) будут доступны извне, что плохо, конечно, но не фатально.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.