¿Hay alguna manera de usar cualquier función C++ como ranura Qt, sin que su clase herede de QWidget?Uso de cualquier función de C++ como ranura Qt
Respuesta
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 ejemploQWidget
,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
Qt
slots
ysignals
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
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
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
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
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.
Es suficiente para heredar QObject: http://qt-project.org/doc/qt-4.8/signalsandslots.html
En Qt 5, puede. Consulte http://qt-project.org/wiki/New_Signal_Slot_Syntax
En Qt 4, esto no se admite directamente, pero hay un par de bibliotecas que proporcionan esta funcionalidad al transmitir la señal a través de un slot en un QObject oculto que llama a su función no de ranura. Mi intento de esto se puede encontrar en https://github.com/robertknight/qt-signal-tools. Hay enlaces a otras implementaciones en la parte inferior del archivo README.
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
- 1. señal de C++ para ranura QML en Qt
- 2. C++ Señal de Qt y ranura que no se activa
- 3. Llamada de señal/ranura vs. función directa
- 4. Qt: significado del valor de retorno de la ranura?
- 5. Qt cuestión de pasar argumentos a la ranura
- 6. ¿Cómo pasar variables a los métodos de ranura en QT?
- 7. El uso de std :: función como delegado en C++ 11
- 8. Comprobando todas las conexiones Qt de señal/ranura
- 9. Cómo implementar una señal/ranura definida en Qt Designer
- 10. Objetivo c - cualquier cosa como c?
- 11. Interacción señal/ranura para dos complementos en Qt
- 12. Qt usando boost :: shared_ptr en una señal/ranura
- 13. Determine las señales conectadas a una ranura dada en Qt
- 14. ¿Cómo se puede usar Qt Creator como IDE general de C++ (sin uso de la biblioteca Qt)?
- 15. C++ función se unen para su uso como argumento de otra función
- 16. Uso de ACS en la ranura de Azure Staging
- 17. Uso de SQLite con Qt
- 18. ¿Debo usar los mecanismos de ranura/señal de Qt sobre las devoluciones de llamada tradicionales?
- 19. Uso de ostream como referencia (C++)
- 20. Uso emiten una señal vs llamando como si fuera una función regular en Qt
- 21. C# pase cualquier método como parámetro
- 22. C# enumera como parámetros de función?
- 23. Uso de los iconos estándar de Qt desde Qt Creator
- 24. C: Uso de la función memset
- 25. Qt/C++ Manejo de errores
- 26. Impulse cualquier uso
- 27. ¿Puede cualquier función ser una función eliminada?
- 28. Qt - mezclando Qt y std :: C++ tipos
- 29. ¿es XULRUNNER adecuado como reemplazo para otros frameworks de aplicaciones de escritorio C++ como QT?
- 30. Tipo de argumento para la señal Qt y la ranura, ¿importa la referencia de los calificadores?
No estoy seguro de si está duplicado, pero esto podría ayudar: http://stackoverflow.com/questions/8533906/ –