2010-05-09 17 views
5

Tengo dos instancias de subclases de QObject y dos instancias de señal de QMetaMethod en uno de los objetos y ranura en otro objeto. Quiero conectar esta señal y ranura entre sí.Cómo utilizar QMetaMethod con QObject :: connect

He buscado en el archivo qobject.h y encuentro que las macros SIGNAL() y SLOT() solo agregan caracteres "1" o "2" al comienzo de la firma del método para que parezca que debería ser posible para agregar el mismo carácter al comienzo de la cadena devuelta por QMetaMethod :: signature() pero este enfoque depende de algunos elementos internos no documentados del kit de herramientas y puede romperse en cualquier momento con una nueva versión de Qt.

¿Alguien sabe de manera confiable para conectar señales y ranuras a través de su representación de reflexión QMetaMethod? sugerencia que he creado en el seguimiento de incidencias Qt::

Editado https://bugreports.qt.io/browse/QTBUG-10637 Si alguien también interesado en esta función se puede votar por este billete allí.

Respuesta

1

Parece que no hay forma de hacerlo funcionar sin depender de la implementación interna. Si yo fuera usted, enviaría la solicitud de función al Qt bug tracker, escribiría un código que imita el comportamiento actual de las macros SIGNAL/SLOT y agregará la prueba unitaria que fallará cuando cambie el comportamiento SIGNAL/SLOT.

Puede haber una solución más simple al problema que está tratando de resolver: describa exactamente qué está tratando de hacer sin ningún detalle de implementación.

+0

Parece que tiene razón. Trataré de preguntar en la lista de correo de Qt-interest y, si no hay respuesta, completaré una entrada en la lista de deseos. – VestniK

+0

Tengo algunas clases proxy generadas que crean y envían solicitudes RPC cuando llamáis a las tragamonedas y emiten señales cuando reciben alguna solicitud RPC a través de la red (es mi pequeña biblioteca de código abierto http://qremotesignal.googlecode.com).Quiero agregar una función que pueda conectar automáticamente todas las señales compartidas de RPC y la ranura en la clase de proxy con señales y ranuras de alguna clase de destino que funcionan realmente en una aplicación que utiliza esta biblioteca. – VestniK

0

Si el método de firma es público en QMetaMethod, el resultado no debe ser roto por trolls y es seguro usarlo (la documentación no dice nada sobre "peligros" cuando se utiliza el método QMetaMethod :: signature). Creo que puedes usarlo con seguridad. Solo para estar seguro, ¿qué versión de Qt estás usando en este momento?

+0

no exactamente correcto. Como en la documentación de QObject :: connect se dice que para los parámetros de señal y de ranura se deben utilizar las macros SIGNAL() y SLOT(), no puedo usar la función QMetaMethod :: signature(). Esas salidas de macros difieren del resultado de QMetaMethod :: signature(). Lo peor en esta situación es que esas macros no se pueden usar con cadenas calculadas en tiempo de ejecución. – VestniK

+0

Y estoy usando Qt 4.6.2 (última versión disponible en el repositorio oficial de Ubuntu 10.04) – VestniK

11

Esto se ha solucionado a partir de Qt 4.8.0:

https://bugreports.qt.io/browse/QTBUG-10637

Supongamos que tenemos un QObject * m_subject, y desea conectar la señal de cambio de notificación de una propiedad a un PropertyChanged() Ranura :

const QMetaObject* meta = m_subject->metaObject(); 
QMetaProperty prop = meta->property(meta->indexOfProperty("myProperty")); 
if (prop.hasNotifySignal()) { 
    QMetaMethod signal = prop.notifySignal(); 
    QMetaMethod updateSlot = metaObject()->method(
     metaObject()->indexOfSlot("propertyChanged()")); 
    connect(m_subject, signal, this, updateSlot); 
} 

he utilizado con éxito esto para hacer una subclase QWidget que encuentra todas las propiedades de cualquier QObject y crea una QLineEdit para cada uno de ellos, con una conexión para mantener el QLineEdit actualizada cada vez que el correspondiente cha propiedad nges. (Debido a que no encontré la manera de pasar un valor de propertyID a propertyChanged(), fue necesario crear una subclase de QLineEdit e implementar propertyChanged() allí. QSignalMapper no ayudó, porque todas las propiedades están en el mismo objeto.)

+2

Sí, fue arreglado por mi propio parche enviado a Qt :) – VestniK

Cuestiones relacionadas