Qt4.5: Использование localsocket на основе цикла событий перед app.exec - PullRequest
3 голосов
/ 18 ноября 2009

Я столкнулся с практической проблемой с Qt. Я использую класс, который связывается с QLocalSocket с другим процессом (каналы / сокеты unix), и мне нужно сделать это общение до того, как произойдут другие события, то есть до запуска app.exec () (или, точнее, сразу после запуска приложения). ). Классу, который я использую, нужен цикл событий, поэтому он не будет работать, если я вызову методы класса до запуска цикла событий. Есть ли способ начать что-то, когда цикл обработки событий готов? Я подумал о том, чтобы создать скрытое окно, предназначенное только для событий, и выполнить свои обязанности в конструкторе скрытых окон, а также пометить это окно как верхнее.

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

Есть идеи?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 18 ноября 2009

Вы можете запустить отдельный цикл события, используя QEventLoop , перед вызовом QApplication :: exec (). Вы должны испустить сигнал "done" из вашего класса и подключить его к слоту 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 () в вашем окне, как только это будет сделано, вызовите show ().

2 голосов
/ 18 ноября 2009

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

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

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

...