Mi conexión señal / ranura no funciona

Veo repetidamente a personas que tienen problemas con las máquinas tragamonedas que no reciben llamadas. Me gustaría recostackr algunas de las razones más comunes. Entonces quizás pueda ayudar a la gente y evitar muchas preguntas redundantes.

¿Cuáles son las razones por las que las conexiones de señal / ranura no funcionan? ¿Cómo se pueden evitar tales problemas?

    Existen algunas reglas que facilitan la vida con señales y ranuras y cubren la razón más común para las conexiones defectuosas. Si olvidé algo, por favor dígame.

    1) Verifique la salida de la consola de depuración:

    Cuando se producen errores de ejecución, la salida de depuración puede mostrarle el motivo.

    2) Use la firma completa de señal y ranura:

    En lugar de

    connect(that, SIGNAL(mySignal), this, SLOT(mySlot)); 

    escribir

     connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))); 

    y revisa tu ortografía y mayúsculas.

    3) Usa las sobrecargas existentes:

    Compruebe cuidadosamente si está utilizando las sobrecargas deseadas de señal y ranura y si las sobrecargas que utilizó realmente existen.

    4) Su señal y ranura deben ser compatibles:

    Esto significa especialmente que los parámetros deben ser del mismo tipo (las referencias son toleradas) y tienen el mismo orden.

    La syntax en tiempo de comstackción también necesita la misma cantidad de parámetros. La antigua syntax de tiempo de ejecución permite conectar señales a ranuras con menos parámetros.

    5) Siempre verifique el valor de retorno del método de conexión (los progtwigdores nunca deben ignorar los valores de retorno):

    En lugar de

     connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))); 

    siempre use algo como

     bool success = connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))); Q_ASSERT(success); 

    O si desea lanzar una excepción o implementar el manejo completo de errores. También puedes usar una macro como esa:

     #ifndef QT_NO_DEBUG #define CHECK_TRUE(instruction) Q_ASSERT(instruction) #else #define CHECK_TRUE(instruction) (instruction) #endif CHECK_TRUE(connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)))); 

    6) Necesitas un bucle de evento para las conexiones en cola:

    Es decir, cuando conectes señales / ranuras de dos objetos propiedad de diferentes hilos (llamadas conexiones en cola) necesitas llamar a exec(); en el hilo de la ranura!

    El ciclo de eventos también debe ser servido. ¡Cada vez que el hilo de la ranura está atascado en algún tipo de bucle ocupado, las conexiones en cola NO se ejecutan!

    7) Necesita registrar tipos personalizados para conexiones en cola:

    Por lo tanto, al usar tipos personalizados en las conexiones en cola, debe registrarlos para este fin.

    Primero declare el tipo usando la siguiente macro:

     Q_DECLARE_METATYPE(MyType) 

    Luego use una de las siguientes llamadas:

     qRegisterMetaType("MyTypedefType"); // For typedef defined types qRegisterMetaType(); // For other types 

    8) Prefiere nueva syntax de tiempo de comstackción sobre la syntax comprobada en tiempo de ejecución anterior:

    En lugar de

     connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))); 

    usa esta syntax

     connect(that, &ThatObject::mySignal, this, &ThisObject::mySlot)); 

    que verifica la señal y la ranura durante el tiempo de comstackción e incluso no necesita que el destino sea una ranura real.

    Si su señal está sobrecargada, use la siguiente syntax:

     connect(that, static_cast &ThatObject::mySignal), this, &ThisObject::mySlot); // ::of(&ThatObject::mySignal), this, &ThisObject::mySlot); // >=Qt5.7 & C++11 connect(that, qOverload(&ThatObject::mySignal), this, &ThisObject::mySlot); // >=Qt5.7 & C++14 

    Tampoco mezcle las señales / ranuras const / non-const para esa syntax (normalmente las señales y las ranuras no serán const).

    9) Tus clases necesitan una macro Q_OBJECT:

    En las clases en las que utiliza las especificaciones de “señales” y “slots”, debe agregar una macro Q_OBJECT como esta:

     class SomeClass { Q_OBJECT signals: void MySignal(int x); }; class SomeMoreClass { Q_OBJECT public slots: void MySlot(int x); }; 

    Esta macro agrega metainformación necesaria a la clase.

    10) Tus objetos deben estar vivos:

    Tan pronto como se destruye el objeto emisor o el receptor, Qt descarta automáticamente la conexión.

    Si la señal no se emite: ¿el objeto emisor aún existe? Si no se llama a la ranura: ¿el objeto receptor aún existe?

    Para verificar la vida útil de ambos objetos, utilice un punto de interrupción del depurador o algún resultado de qDebug () en los constructores / destructores.

    11) Todavía no funciona:

    Para hacer una verificación muy rápida y sucia de la conexión, emite la señal por ti mismo usando algunos argumentos ficticios y ve si se llama:

     connect(that, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))); emit that->mySignal(0); // Ugly, don't forget to remove it immediately 

    Finalmente, por supuesto, es posible que la señal simplemente no se emita. Si siguió las reglas anteriores, probablemente algo esté mal en la lógica de su progtwig. Lee la documentación. Usa el depurador Y si ahora hay otra manera, pregunta en stackoverflow.