q_object q_disable_copy eventfilter qt dynamic signals-slots

q_disable_copy - Creando una ranura dinámica en Qt



qt object connect (2)

Estoy intentando crear slots dinámicamente y conectarlos. Soy capaz de crear dinámicamente PushButtons y conectarlos con las ranuras existentes. Pero, ¿qué sucede si tengo una clase con algunas funciones miembro y quiero usar estas funciones como espacios?

Desde una perspectiva general, quiero crear una plantilla para generar espacios dado un puntero a la función. Esto nos permite crear ranuras sin cambiar el código existente y no tenemos que volver a compilar usando MOC. Si esto no tiene sentido, házmelo saber. Gracias.

-CV


Una continuación del código de andref para usar cualquier función miembro como un espacio

class SlotForwarder : public QObject { Q_OBJECT public: typedef void (*Function)(); SlotForwarder(Function function, QObject* parent = 0) : QObject(parent) , m_fptr(function) {} public slots: void forward() { m_fptr(); } private: Function m_fptr; }; int main(){ QApplication a(argc, argv); MyClass myClassObject; //contains a function called MemberFunc //create a slotforwarder object so SlotForwarder *memberFuncSlot = new SlotForwarder (std::tr1::bind(&MyClass::MemberFunc, &myClassObject)); QObject::connect(ui.button,SIGNAL(clicked()),memberFuncSlot,SLOT(forward()); }


Tiene mucho sentido. Supongo que QSignalMapper no es lo que quieres. Si sus funciones no tienen argumentos, tal vez algo como esto sea suficiente:

class SlotForwarder : public QObject { Q_OBJECT public: typedef void (*Function)(); // or whatever. I never get this syntax right... SlotForwarder(Function function, QObject* parent = 0) : QObject(parent) , m_fptr(function) {} public slots: void forward() { m_fptr(); } private: Function m_fptr; };

Cree uno para cada función que quiera encapsular y conéctese al forward como de costumbre.

Ahora, si tienen argumentos, tal vez este artículo trimestral de Qt pueda ser de ayuda.

Señales dinámicas y ranuras de Eskil A. Blomfeldt

La técnica implica qt_metacall método qt_metacall usted mismo. El método tiene esta firma:

int QObject::qt_metacall(QMetaObject::Call call, int id, void **arguments)

La llamada es el tipo de metacall: ranura, señal, propiedad de lectura o escritura, etc. Cada ranura tiene una identificación . Los parámetros están empaquetados (por valor o como punteros) dentro de la matriz de argumentos . Leer el código que genera el moc es una buena forma de entender cómo funciona todo.

Los datos sobre las firmas de funciones sin procesar están disponibles solo durante el tiempo de compilación, pero las ranuras se resuelven en tiempo de ejecución. Debido a esa falta de coincidencia, deberá ajustar las funciones en un tipo de adaptador de plantilla que presente una interfaz constante para su implementación de qt_metacall y convierta la matriz de arguments en algo que la función pueda entender ( consulte el operador de desempaquetado de Python). Boost.Signals hace ese tipo de piratería de plantilla .