Pregunta

estoy frente a un problema práctico con Qt. Estoy usando una clase que se comunica con QLocalSocket a otro proceso (tuberías / conectores Unix) y tengo que hacer que la comunicación antes de que ocurran otros eventos, es decir, antes app.exec () comienza (o, más precisamente, en cuanto se efectúe de aplicaciones ). La clase que estoy usando necesita un eventloop por lo que no funciona si llamo a los métodos de la clase antes de que se inicie un ciclo de eventos. Hay alguna manera de empezar algo cuando el bucle de eventos está listo? Pensé en hacer una ventana de eventos de sólo oculta y hago mis deberes en el constructor ventana oculta, y establecemos esta ventana de nivel superior.

Básicamente, necesito esta tarea de comunicación local sockets para comenzar tan pronto como el ciclo de eventos que se disponga.

¿Alguna idea?

Gracias.

¿Fue útil?

Solución

Se podría iniciar un eventloop separado, utilizando QEventLoop , antes de llamar a QApplication :: exec (). Se debe emitir una señal de "hecho" de su clase y que conecte a la QEventLoop quit () ranura, o utilizar una señal existente proporcionada en la clase Qt que está utilizando.

Aquí hay un ejemplo sencillo obtener una página web utilizando QNetworkAccessManager:

app = QtCore.QCoreApplication([])
manager = QtNetwork.QNetworkAccessManager()
req = QtNetwork.QNetworkRequest(QtCore.QUrl("http://www.google.com"))
resp = manager.get(req)
eventloop = QtCore.QEventLoop()
eventloop.connect(resp, QtCore.SIGNAL('finished()'), QtCore.SLOT('quit()'))

eventloop.exec_() # this will block until resp emits finished()

print resp.readAll()

app.exec_()

Si bien esto puede satisfacer sus necesidades, que no pude entender por qué no se puede simplemente hacer cualquier negocio que tiene antes de llamar a show () en su ventana, una vez hecho, muestran una llamada ().

Otros consejos

Si sólo tiene que iniciar las comunicaciones antes de todo lo demás, sólo tiene que utilizar un temporizador de disparo único con 0 ms de retardo:

QTimer::singleShot(0, commsInstancePtr, SLOT(startCommunication()));

Si usted necesita sus operaciones para terminar en realidad antes de hacer cualquier otra cosa, la solución de Daniel podría ser más adecuado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top