问题标签 [qeventloop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
6892 浏览

qt - Qt库事件循环问题

我正在编写一个 DLL,它被另一个应用程序用作插件,并希望利用 Qt 的功能。
我已经设置、编译和运行了所有类,但没有发出任何信号。所以看起来好像没有QEventLoop。

尝试1:
我将我的主类修改为子类QThread而不是QObject,并在run()中创建一个QEventLoop,连接所有信号/插槽,并执行线程。
但是它没有说没有 QApplication 就不能拥有 QEventLoop。

尝试 2:
我修改了主类(仍然是 QThraed 的子类)以实例化 QCoreApplication,连接所有信号/插槽,然后执行应用程序。
警告 QApplication 不是在 main() 线程中创建的,并且仍然不会发出信号。

我不确定在这里做什么。我显然无法在将使用我的插件的应用程序中创建一个 QCoreApplication,而且我不能在没有它的情况下发出信号。

我已经包含了一个简单的(并且写得很糟糕)测试应用程序,它应该可以说明我的问题:

任何帮助,将不胜感激!

主.cpp:

ThreadThing.h:

ThreadThing.cpp:

输出:

0 投票
2 回答
1694 浏览

qt - QDialog 弹出另一个 QDialog

我有一个包含一堆子类 QSpinBox 的子类 QDialog。单击旋转框时,您可以在其中使用按钮输入数字的小键盘(另一个 QDialog)。两个 QDialog 都是通过调用 QDialog::exec(); 来激活的。

但是,当打开第二个 QDialog 时,第一个会关闭。我已经通过它并注意到第一个 QDialog 还没有结束。QDialog 1在我完成QDialog 2后发出“QDialog::Rejected”。我想要的是QDialog 1根本不结束,它需要用输入的值更新spinbox并为其他spinbox打开更多的QDialog用户想稍后编辑。

我认为这与 QDialog 1 的事件循环被 QDialog 2 的事件循环杀死有关。我尝试在 QDialog 2 上使用 QDialog::show。小部件会弹出片刻(毫秒)但不会保持活动状态。QDialog 1 也立即关闭。

0 投票
1 回答
2743 浏览

qt - QEventLoop 和 QNAM 的 QTimer 超时问题

我创建了自己的 HTTP 类,该类利用 QNAM 并提供发送 HTTP 请求的方法。它使用 QEventLoop 进行同步,使用 QTimer 进行超时。

我的解决方案面临一些问题。在某些 Symbian 平台上,我的 QTimer 信号超时太快(例如,在 1 秒后超时为 30 秒)。如果我的 HTTP Post 播放负载很大或者我通过 GET 下载文件(请求需要一些时间才能完成),通常会发生这种情况。我想指出,相同的代码在某些设备(S60 第 3 版)上运行良好,但另一方面,某些设备(第 5 版)几乎总是出现此错误。

这是一个代码片段:

我个人认为以下之一可能会导致问题:

  • 重新进入本地事件循环会弄乱信号
  • 我多次使用相同的 QNAM(在同一会话期间有多个请求)。这是必需的,因为如果我销毁 QNAM,我的会话将在服务器端关闭。

有没有人能够看到一些可能导致这种行为的错误?

平台:Symbian S60 3rd/5th edition

工具:诺基亚 Qt SDK

0 投票
2 回答
1447 浏览

qt - QThread/QDialog 的竞争条件

我试图在以下情况下避免竞争条件:

当线程在 QDialog::exec() 设置对话框之前完成时,由信号触发的“accept()”调用将丢失,对话框不会自行关闭...

所以理想情况下,我只想在对话框准备好处理它之后才启动线程,但我该怎么做呢?

0 投票
2 回答
1007 浏览

c++ - 在每个应用程序的事件循环迭代中执行槽

如何在应用程序事件循环的每次迭代中调用我的插槽?我知道的唯一方法是使用 QTimer 并且在每个超时(每毫秒)信号上我都可以调用我的插槽。但我不喜欢这个选项,它看起来像解决方法。

任何建议如何更正确地做到这一点?

0 投票
3 回答
7158 浏览

python - PYQT - 如何使用取消按钮取消我的 GUI 中的循环?

我已经为此苦苦挣扎了一段时间。我会尝试解释我想做什么,也许你们可以帮助我。

所以假设我有带有状态标签的 GUI 和两个看起来像这样的循环:

我希望在按下 START(完成)后使用结果更新标签(STATUS),并且我想在按下 STOP 按钮时取消循环。

如何使用线程、QEventloop 或任何其他方式(如果存在)来实现这一点。我几乎是 PyQT 的初学者,所以如果有人有任何想法 - 请分享。

谢谢。

0 投票
1 回答
1089 浏览

qt - QT 中未记录的 ProcessEventsFlag 枚举

我注意到 QT 上的模态对话框使用本地 QEventLoop 并将 ProcessEventFlags 设置为“DialogExec”

QT 助手没有关于这个枚举意味着什么的信息。还有一个叫做 EventLoopExec。任何人都知道它们的实际含义以及为什么没有记录它们?

谢谢

0 投票
2 回答
8866 浏览

python - PySide 在工作线程中等待来自主线程的信号

我决定在我的一个脚本中添加一个 GUI。该脚本是一个简单的网络爬虫。我决定使用工作线程,因为下载和解析数据可能需要一段时间。我决定使用 PySide,但我对 Qt 的一般知识非常有限。

由于脚本应该在遇到验证码时等待用户输入,我决定它应该等到QLineEdit触发returnPressed,然后将其内容发送到工作线程,以便它可以发送它进行验证。这应该比忙着等待按下返回键要好。

似乎等待信号并不像我想象的那么简单,在搜索了一段时间后,我遇到了几个类似的解决方案。不过,跨线程发信号和工作线程中的本地事件循环使我的解决方案更加复杂。

经过几个小时的修补,它仍然无法正常工作。

应该发生什么:

  • 下载数据直到引用验证码并进入循环
  • 下载验证码并将其显示给用户,首先QEventLoop调用self.loop.exec_()
  • QEventLoop通过调用通过类中loop.quit()连接的工作线程槽退出self.line_edit.returnPressed.connect(self.worker.stop_waiting)main_window
  • 如果验证失败,则验证验证码并循环,否则重试现在应该可以下载的最后一个 url,然后继续下一个 url

怎么了:

  • ...看上面...

  • 退出QEventLoop不起作用。调用它之后self.loop.isRunning()返回。return ,因此线程似乎在奇怪的情况下没有死。线程仍然停在该行。因此,即使事件循环告诉我它不再运行,线程仍被卡在执行事件循环中。Falseexit()self.isRunningTrueself.loop.exec_()

  • GUI 的响应与工作线程类的槽一样。我可以看到发送到工作线程的文本、事件循环的状态和线程本身,但是在执行上述行之后什么都没有。

代码有点复杂,因此我添加了一些伪代码-python-mix,省略了不重要的:

0 投票
1 回答
1092 浏览

pyqt4 - QT4Reactor / Scrapy / PyQt4

如何正确使用 Qt4Reactor?

我有一个运行 Scrapy 的 PyQt4 应用程序来解析网站并在 ui 中显示结果。

当用户单击一个按钮时,刮板将在另一个进程中启动。ui 块和刮板正在运行。刮板完成后,数据显示在ui中。我想要的是 Scrapy 运行时的非阻塞 ui。

由于 Scrapy 是建立在 twisted 之上的,因此我必须使用新进程而不是线程来从 ui 启动它。

我的问题是如何尽可能简单地实现非阻塞用户界面?

我尝试像这样使用 Qt4Reactor:

这会导致错误:

我向这个主题发布了另一个问题: Integrate Scrapy/Twisted event loop in PyQt4 Main loop

提前致谢。

0 投票
1 回答
1267 浏览

qt5 - Qt:QNetworkAccessManager 不发送请求

我使用 QNetworkAccessManager 来处理发送一个 http 请求:

如果没有 QEventLoop().exec(); 行,应用程序将不会发送请求。但是如果使用 QEventLoop().exec(); 行,它会的。我不明白为什么?
你能清除我吗?
非常感谢!(P/s:我看过这个链接:Sending an HTTP request using QNetworkAccessManager