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 ...
- Compruebe si su clase hereda
QObject
o cualquier clase derivada de QObject- Añadir macro
QObject
dentro de la definición de claseQ_SLOTS
slots
oQ_SLOTS
después de su palabra clave privada / protegida / pública para su evento- 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 .