Qt - нет такой ошибки сигнала - PullRequest
8 голосов
/ 09 апреля 2010

Я пытаюсь вызвать сигнал, когда двойной щелчок происходит в одном из перетаскиваемых виджетов на примере магниты на холодильник . Вот изменения, которые я внес в пример источника:

DragLabel:

class DragLabel : public QLabel
{
public:
    DragLabel(const QString &text, QWidget *parent);
    QString labelText() const;

public slots:
    void testSlot(){qDebug()<<"testSlot";}    //<-- implemented this slot

protected:
    void mouseDoubleClickEvent(QMouseEvent *ev){emit testSignal();}    //<-- overriden this method

private:
    QString m_labelText;

signals:
    void testSignal();    //<-- added this signal

};

Единственное, что я изменил в файле реализации, это добавление connect(this,SIGNAL(testSignal()),this,SLOT(testSlot())); в конструктор DragLabel.

Попытка скомпилировать проект привела к ' неопределенной ссылке на `DragLabel :: testSignal () ' и ' collect2: ld вернул 1 состояние выхода ' ошибки.

Когда я закомментирую вызов сигнала, он компилируется и запускается, но выдает ' Object :: connect: такого сигнала нет QLabel :: testSignal () в draglabel.cpp ' предупреждение в вывод приложения. Очевидно, что testSignal () не распознается как сигнал.

Я пытался добавить макрос Q_OBJECT в DragLabel, но это приводит к 4 ' неопределенным ссылкам на `vtable for DragLabel' 'предупреждений и' collect2: ld вернул 1 состояние выхода 'ошибка.

Чего мне не хватает?

Ответы [ 2 ]

12 голосов
/ 09 апреля 2010

Поместите макрос Q_OBJECT вверху (должен быть первым в классе, а не ";")

Убедитесь, что вы делаете полную перестройку, надстройка VS не всегда замечает, что файл стал qt-совместимым без перестройки.

Еще полезные советы 20 способов отладки сигналов и слотов Qt

0 голосов
/ 24 декабря 2011

Это был макрос в конце. Мне пришлось перезагрузить компьютер, чтобы он заработал, хотя очистка и перестройка проекта не сработали. Перед перезагрузкой Qt Creator продолжал выдавать ошибку «ld return 1 exit status» и предупреждения vtable. Очень странно. - Дэвид МакДэвидсон

Это не странно, это глупо. Я получил ту же ошибку, но я делаю это после перестановки файлов .h. Скажи:

1 classA.h включает calssB.h;

2 classB.h объявил два класса, classB и classC (classB.h объявил сигналы и слот)

Я делаю три вещи,

  1. отдельный класс C для другого файла .h

  2. исключить все предварительные объявления класса о классе B

  3. classB.h включено classA.cpp, кроме classA.h

после этого QT скомпилировал его. Я проверю, работает ли он.

...