signal q_object eventfilter c++ qt qt5 qt-signals

c++ - q_object - qt object connect



Función de conexión QObject (3)

Comparto otro posible problema aquí ya que esta publicación es la más importante en la búsqueda de Google.

Además de agregar QObject , también debe agregar public slots: o public Q_SLOTS: para su evento personalizado. De lo contrario, aún se encontrará con el QObject::connect: No such slot existe QObject::connect: No such slot error de QObject::connect: No such slot .

Doy un breve resumen aquí de acuerdo con la publicación de Zeta y la otra publicación.

Para resolver el “No such slot” error , debe verificar ...

  1. Compruebe si su clase hereda QObject o cualquier clase derivada de QObject
  2. Añadir macro QObject dentro de la definición de clase
  3. Q_SLOTS slots o Q_SLOTS después de su palabra clave privada / protegida / pública para su evento
  4. Si marca 1-3, limpie , ejecute qmake y vuelva a reconstruir para asegurarse de que todas sus cosas en 1-3 sean generadas por moc .

Finalmente, un ejemplo aquí:

class MyClass: public QObject { //check 1 Q_OBJECT //check 2 public slots: //check 3 void onEvent(int); };

Espero que esto salve la vida de otros.

Revisé otras preguntas similares y probé sus soluciones, pero no funcionan para mí.

Básicamente estoy tratando de hacer un cliente http que solo hace solicitudes de publicación. Para hacer esto, necesito conectar la señal terminada de QNetworkManager a alguna ranura de devolución de llamada.

Aquí está mi código.

archivo h :

... public slots: void finishedSlot(QNetworkReply* reply); private: QNetworkAccessManager *network_manager; ...

archivo cpp :

... Class1::Class1(){ network_manager = new QNetworkAccessManager(this); QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *))); } ... void Class1::finishedSlot(QNetworkReply* reply) { // some logic with reply } ...

Como puede ver, la ranura está definitivamente presente y se declara en las ranuras públicas en el archivo de cabecera. Así que no tengo idea de por qué esto está sucediendo. Ya intenté limpiar, ejecutar qmake y reconstruir.

El mensaje de error es:

"QObject :: connect: No hay tal ranura QObject :: finishedSlot (QNetworkReply *)"

¿Alguna idea?


Probablemente te olvidaste de usar la macro Q_OBJECT . Cada clase que implementa sus propias ranuras / señales necesita esa macro. No olvide que necesita agregar su encabezado / archivo fuente al archivo .pro.


Una cosa a tener en cuenta; Ya que está utilizando Qt 5, hay una nueva sintaxis de conexión de ranura de señal, que le permitirá especificar cualquier función y no solo las definidas como ranuras.

En esta situación puedes hacer esto:

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot);

Lo bueno de esta sintaxis es que solo especifica la dirección de la función y no se preocupa por los parámetros, por lo que si los cambia en una función, no necesita actualizarlos en las declaraciones de conexión.

Sin embargo, debería seguir utilizando la macro Q_OBJECT y puede leer más sobre la nueva sintaxis here .