3

我正面临一个 Qt 的实际问题。我正在使用一个与 QLocalSocket 通信到另一个进程(管道/unix套接字)的类,我需要在其他事件发生之前进行通信,即在 app.exec() 启动之前(或者更准确地说,一旦应用程序启动)。我正在使用的类需要一个事件循环,所以如果我在事件循环开始之前调用类方法,它就不起作用。当事件循环准备好时,有什么方法可以开始?我想制作一个仅隐藏事件的窗口并在隐藏窗口构造函数中完成我的职责,并将此窗口稳定为顶层。

基本上,只要事件循环可用,我就需要启动这个本地套接字通信任务。

有任何想法吗?

谢谢你。

4

2 回答 2

7

您可以在调用 QApplication::exec() 之前使用QEventLoop启动一个单独的事件循环。您应该从您的类发出一个“完成”信号并将其连接到 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()。

于 2009-11-18T08:19:03.547 回答
2

如果您只需要在其他一切之前开始通信,您可以简单地使用具有 0ms 延迟的单次计时器:

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

如果您需要在执行其他所有操作之前实际完成操作,Daniel 的解决方案可能更合适。

于 2009-11-18T13:38:02.147 回答