2010-04-09 26 views
8

Estoy tratando de activar una señal cuando ocurre un doble clic en uno de los widgets que se pueden arrastrar en el fridge magnets example. He aquí los cambios que hice a la fuente de ejemplo:Qt - no hay tal error de señal

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 

}; 

Lo único que ha cambiado en el archivo de implementación es la adición de connect(this,SIGNAL(testSignal()),this,SLOT(testSlot())); al constructor de DragLabel.

Tratando de compilar el proyecto dio lugar a 'referencia indefinida a `DragLabel :: testSignal()' 'collect2: ld devolvió 1 Estado de salida' y los errores.

Cuando comento hacia fuera la llamada a la señal, se compila y ejecuta, pero da off 'Objeto :: connect: No existe el QLabel señal :: testSignal() en draglabel.cpp' aviso en la salida de la aplicación. Aparentemente testSignal() no se reconoce como una señal.

He intentado añadir la macro Q_OBJECT a DragLabel pero el resultado es 4 'referencia indefinida a `vtable para DragLabel' 'advertencias y un'collect2: ld devolvió el código de salida 1 'error.

¿Qué me estoy perdiendo?

+0

Su código de muestra no cuenta con la macro llamada Q_OBJECT, que podría ser la causa de sus problemas. –

+0

Oh sí, me olvidé de mencionar eso, intenté agregar Q_OBJECT antes. Añadiré eso a la pregunta. –

Respuesta

12

Ponga la macro Q_OBJECT en la parte superior, (debe ser lo primero en la clase y no ";")

Asegúrese de que vuelve a generar un completo, el VS-add-in especial no siempre se da cuenta que un archivo se ha convertido en qt-aware sin una reconstrucción.

Más buenos consejos 20 ways to debug Qt signals and slots

+0

FUE el macro al final. Tuve que reiniciar mi PC para que funcionara, limpiar y reconstruir el proyecto no funcionó. Antes de reiniciar Qt Creator seguía dando el error 'ld returned 1 exit status' y las advertencias de vtable. Muy raro. –

+0

Gracias Martin. Tu enlace me salvó la vida. En mi caso por el mismo error, era una falta de coincidencia de parámetros en las funciones de señal y ranura. –

+1

@Anisha Kaul - la señal/ranuras son tiempo de ejecución para que el compilador no note errores. Hoy tuve uno donde tuve el error de una sola letra en el medio de un nombre de señal. –

0

Era la macro en el extremo. Tuve que reiniciar mi PC para que funcionara, limpiar y reconstruir el proyecto no funcionó. Antes de reiniciar Qt Creator seguía dando el error 'ld returned 1 exit status' y las advertencias de vtable. Muy raro. - David McDavidson

No es raro, es estúpido. Recibí el mismo error, pero lo hago después de reorganizar los archivos .h. Diga:

1 classA.h include calssB.h;

2 classB.h declaró dos clases, ClassB y ClassC, (classB.h declaró señales & ranura)

hago tres cosas,

  1. ClassC separado a otro archivo .h

  2. eliminar toda declaración de la clase hacia adelante sobre ClassB

  3. classB.h incluido por classA.cpp, otra que por classA.h

después de eso, QT lo compiló. Voy a probar si está funcionando.

Cuestiones relacionadas