Comunicación entre QThread con slot y signal
Es habitual crear un hilo QThread que haga un proceso en segundo plano y vaya avisando de su estado. En mi caso tengo un QTextEdit que me sirve de log para escribir cualquier cosa. El problema es que QT tiene mecanismos de seguridad que impiden a un QThread comunicarse con un QObject creado en otro hilo, como es la interfaz.
Para eso se aprovecha el sistema de signals y slots que permiten la comunicación.
Emisor: clase QThread
Hay que definir una signal en la clase emisora (que será un hilo QThread), el código queda así:
class FileAccess : public QObject, public QThread{
Q_OBJECT
public:
FileAccess(Logic *myLogic){}
~FileAccess(){}
void run(){
emit writeState("Running thread");
}
signals:
void writeState(QString q);
};
Como se puede apreciar, hemos creado nuestra propia señal de nombre writeState que recibe una QString y se emite nada más entrar en la ejecución del hilo.
Conexión con el receptor
Esta señal debe conectarse con el receptor, en mi caso un QTextEdit, para eso se utiliza el método connect():
fa = new FileAccess(); //nuevo hilo QObject::connect(fa, SIGNAL(writeState(QString)), myTextEdit, SLOT(append(QString)), Qt::QueuedConnection); fa->start(); //lanzar hilo fa->wait(); //esperar a que el hilo termine o hacer nuestras tareas
Destaco la segunda línea: conectamos la señal writeState del objeto fa con el slot append del objeto myTextEdit.