2012-03-29 30 views

Respuesta

8

No se puede en Qt Qt versiones < 5.

Para utilizar señales/slots el compilador meta objeto tiene que ser invocado. Para que esto suceda su clase debe cumplir con los siguientes requisitos:

  • Heredar del QObject o cualquier otra subclase (por ejemplo QWidget, QPushButton etc)
  • La macro Q_OBJECT debería definirse en la sección privada de la clase con el fin para habilitar las características meta-objetos, tales como ranuras
  • Usar las palabras clave Qtslots y signals con el fin de declarar qué funciones debe ser mangos por el compilador meta como ranuras o señales

Para más detalles consultar las páginas de documentación correspondiente sobre el y la signals & slots

También compruebe la documentación QObject:

Observe que el Q_OBJECT macro es obligatorio para cualquier objeto que implementa señales, ranuras o propiedades. También necesita ejecutar el compilador de metaobjetos en el archivo de origen. Recomendamos encarecidamente el uso de de esta macro en todas las subclases de QObject, independientemente de si no usan señales, ranuras y propiedades, ya que la falla a puede provocar que ciertas funciones muestren un comportamiento extraño.

Editar: Desde Qt 5, los funtores y las expresiones lambda se pueden usar como ranura. Consulte New Signal Slot Syntax in Qt 5

+1

Importante, sin embargo, aunque esto no es posible en Qt 4, va a ir ser posible en Qt 5, usando el nuevo mecanismo de señal/ranura. http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir

+0

Tiene razón, pero en mi humilde opinión solo debería usarse en casos excepcionales. Usar slots es más elegante que usar tr1 :: bind con funciones simples. – pnezis

+0

estoy absolutamente de acuerdo, deberían ser una rara ocurrencia. Muy parecido a las declaraciones cortas de cirquit if, son útiles en un conjunto muy limitado de circunstancias, y en esos casos aumentan la legibilidad y la facilidad de mantenimiento. Pero, solo deberían usarse entonces, no como una regla general. – leinir

0

Poco probable. El compilador Qt-metaobjeto (moc) ajusta la función, están marcados como ranura -s, en un envoltorio de código relativamente grande. Archivos, creados por moc, comienzan con moc_, búsquelos.

8

Desde Qt 5, los funtores y las expresiones lambda se pueden usar como ranura (como se mencionó anteriormente, aquí: http://qt-project.org/wiki/New_Signal_Slot_Syntax).

Como no pude encontrar código de ejemplo, que añade lo siguiente:

En este ejemplo se utiliza boost::function para un miembro de la clase ClassName::classMember() sin parámetros.

boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance); 
    connect(QObjectInstance, &QObject::signalName, f); 

Cuando la señal y clase de miembro Qt tiene parámetros (por ejemplo ClassName::classMember(int)), la función de impulso debe ser adaptado como sigue:

boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1); 

Más información sobre boost :: bind se pueden encontrar en la documentación: http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html

Cuestiones relacionadas