Tengo un hilo de fondo y el hilo llama a algunos métodos que actualizan la interfaz de usuario (para mostrar barras de progreso y mostrar información adicional en áreas de texto).Qt: Hilo de actualización de la interfaz UI hilo
Si modifico algunos valores de widgets UI, se genera un error de aserción "No se puede enviar eventos a objetos propiedad de un hilo diferente".
Al mirar foros, leí que podría usar el método QMetaObject :: invokeMethod, pero solo funciona si le paso el indicador Qt :: DirectConnection que realmente genera el mismo error que se muestra arriba.
Si uso Qt :: QueuedConnection o Qt :: AutoConnection, invokeMethod devuelve falso.
Mi código es similar a esto:
.h:
class A : public QMainWindow
{
Q_OBJECT
QProgressBar* pb;
public slots:
bool m(bool, int);
};
class B
{
A* a;
public:
void handleEvent();
};
.cpp:
bool A::m(bool x, int y)
{
pb->setValue(y);
return x;
}
void B::handleEvent()
{
//a->m(true, 12); //raises an assertion error
bool r;
//bool ret = QMetaObject::invokeMethod(a, "m", Qt::DirectConnection, Q_RETURN_ARG(bool, r), Q_ARG(bool, true), Q_ARG(int, 12)); //raises the same assertion error error
bool ret = QMetaObject::invokeMethod(a, "m", Qt::AutoConnection, Q_RETURN_ARG(bool, r), Q_ARG(bool, true), Q_ARG(int, 12)); //is ignored and ret contains false.
}
¿Conoce lo que está pasando o lo que estoy haciendo mal? o tal vez, ¿alguien puede sugerirme otro enfoque para lidiar con mi problema de novato?
Gracias de antemano,
Ernesto