QT4.5: Использование LocalSocket на основе событий на основе событий перед app.exec

StackOverflow https://stackoverflow.com/questions/1754256

Вопрос

Я сталкиваюсь с практической проблемой с QT. Я использую класс, который общается с QlocalSocket с другим процессом (Pipes/Unix Sockets), и мне нужно сделать это общение до того, как произойдут другие события, то есть до того, как App.exec () начинается (или точнее, как только начинается приложение ) Класс, который я использую, нуждается в EventLoop, поэтому он не работает, если я позвоню в методы класса до начала цикла событий. Есть способ начать что -то, когда готовой петля событий? Я подумал о том, чтобы сделать скрытое окно только для событий и выполнять свои обязанности в скрытом конструкторе окна, и стабили это окно как Toplevel.

По сути, мне нужна эта задача общения в локальном сокете, чтобы начать, как только петля событий станет доступной.

Любые идеи?

Спасибо.

Это было полезно?

Решение

Вы можете начать отдельный EventLoop, используя Qeventloop, перед вызовом QApplication :: exec (). Вы должны излучать сигнал «выполненного» из вашего класса и подключить его к слоту Qeventloop Quit () или использовать существующий сигнал, предоставляемый в классе QT, который вы используете.

Вот простой пример, который выбирает веб -страницу с использованием 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_()

Хотя это может соответствовать вашим потребностям, я не мог понять, почему вы не можете просто заняться тем, что у вас есть до вызова Show () в вашем окне, как только это будет сделано, Call Show ().

Другие советы

Если вам просто нужно запустить связь перед всем остальным, вы можете просто использовать таймер с одним выстрелом с задержкой 0MS:

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

Если вам нужны ваши операции, чтобы фактически закончить, прежде чем делать все остальное, решение Даниэля может быть более подходящим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top