问题标签 [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 投票
1 回答
805 浏览

c++ - 模态 QProgressDialog::setValue() 导致嵌套事件循环崩溃

我刚刚写了一些基于 QThread 的代码来执行一个大的计算。为了可视化进度,我需要打开一个 QProgressDialog。该对话框是应用程序模式(使用 open()),因为我不想在计算期间允许修改主窗口。线程发出各种信号,允许在 GUI 和线程之间进行基于状态机的通信。

线程的工作对象发出的两个信号是“Progress”和“Finished”。如果发出“Progress”,我将使用 setValue() 更新 QProgressDialog。如果发出“Finished”,则对话框被销毁。

在计算结束时会发生以下情况:

  • 发出“进度”事件 (100%)
  • “完成”后直接发出
  • 由于“进度”事件而调用 setValue(100)
  • 因为对话框是模态的,所以 setValue() 调用 processEvents()
  • processEvents() 传递“Finished”事件
  • “Finished”事件导致 Dialog 在 setValue() 中间被销毁,从而导致崩溃

QProgressDialog 通过在 setValue() 中调用 processEvents() 来破坏我的架构。此外,我的编码约定禁止使用任何嵌套的事件循环(如在 exec() 等中)。

我有两个问题:

  1. 为什么模态对话框需要嵌套事件循环?从我的理解来看,阻止父窗口的输入似乎不需要这个。

  2. 是否可以以模态方式使用 QProgressDialog 但没有嵌套事件循环?

0 投票
0 回答
419 浏览

qt - QEventloop 块边界

我声明 QEventloop 类属性:

然后在一个类方法中,我想为特定的代码段设置事件循环,我不明白 QEventloop 如何知道它的边界,这是代码:

0 投票
0 回答
562 浏览

qt - QT关闭QDialogs / QMessageBox在父窗口关闭时通过调用exec()打开

我正在使用 exec() 打开一个 QDialog/QMessageBox 来获取用户输入。但在用户从消息框中选择保存或放弃之前,打开它的父窗口将关闭。

发生这种情况时,应用程序崩溃了。

QDialog/QMessageBox 是否可以在关闭父级时关闭。?

窗口关闭代码:

0 投票
0 回答
219 浏览

python - 如何在 Pyqt4 中将 loadFinished 添加到 QEventloop

我正在使用 PyQT4(第一次)来抓取一些页面。因为我尝试抓取多个页面,所以我使用 QEventloop。但是我无法将 loadFinished 信号添加到代码中。这是我的代码的样子:

最后它只是重新启动脚本并且什么都不做。我试图在这里实现用户 Mip 提供的解决方案:Web Scraping Multiple Links with PyQt / QtWebkit 我认为将用户代理添加到上述应用程序和隐式睡眠(类似于 selenium 案例)将解决我的问题。但我无法做到。现在我收到以下错误。我认为这是因为 PyQt4 在加载源内容之前退出循环:

0 投票
1 回答
527 浏览

multithreading - 了解 Qt 多线程和事件循环

我正在寻求澄清以帮助我理解 Qt 4.8 中的 Qt 多线程和事件循环。我还要补充一点,我是一般线程的新手,所以这是我的问题的一部分。

我目前的情况是我有一个需要经常使用 QTMultiMedia-QAudioOutput 播放声音的 Qt 应用程序。我有两个课程,MainGuiAudioWorker。我希望经常调用 AudioWorker 来“播放()”声音。

显然 QAudioOutput 必须有一个事件循环,因此该过程不会在播放声音之前结束,如果这是在主类中完成的,它将阻止一切。所以我知道线程会有所帮助。

现在,如果我正确理解线程,生成的线程不能比创建它的函数寿命更长,除非它以某种方式分离?因此,如果我在 MainGui 类中收到播放声音的通知,并且我通过插槽连接生成了一个新线程,该线程在 AudioWorker 中调用 play(),一旦我的 MainGui 通知函数结束,带有事件循环的线程不会死吗?如果是这种情况,重点是什么,无论哪种方式 MainGui 都需要事件循环?

我肯定错过了什么吗?我是否需要以某种方式分离线程?我在 Qt 文档中没有看到太多关于分离的内容。仅仅播放一个简单的声音,整个过程似乎太过分了。


更新

通过在 play() 函数中创建 QThread 解决了问题。在我发出信号之前,线程不会过早退出。

在以下位置找到了一个隐藏但很好的示例:https ://nachtimwald.com/2015/05/02/effective-threading-using-qt/

0 投票
0 回答
792 浏览

c++ - Qthread deleteLater() 崩溃程序

QT 4.8:我的代码中出现了一些段错误和 I/O 可能的错误,我无法弄清楚。从打印语句中,我看到了许多奇怪且不一致的行为,可能表明存在竞争条件。很多时候一切都很完美。有时我在调用 worker 析构函数后立即收到 I/O 错误,表明主连接 deleteLater() 问题。其他时候,如果我尝试在析构函数中删除 audioOutput,它将工作多次,然后在其他尝试的析构函数中间随机给我一个段错误(或 I/O)。我相信我的问题可以归因于两件事,worker cleanup/connect quit()/deletelater() 调用和我在 worker 中的递归循环,它每次都需要创建自己的事件循环,因此可能在之前的调用之前发出完成的信号可以是清理了吗?

具体来说,我的问题是:

什么可能导致 deleteLater() 创建 I/O 可能的错误?

我应该如何删除工人类内部的指针,以便在正确的时间(结束)删除它们......还是 QT 为我处理这个?

桂和.h

工人阶级和.h


更新:

仍然存在间歇性问题,但注释掉以下行有助于清除其中一些问题并结合设置 quit=true。

但这可能会导致内存泄漏?


更新 2:

我开始认为我在这里自言自语,但我想我明白了。这似乎是一个时间问题,因为线程在工作人员实际完成之前返回完成(),因为一旦工作人员发出完成(),退出()信号就会关闭开环。因此,我现在为每个关闭的循环从 worker 发出一个自定义信号,并在 main.js 中跟踪它。一旦我收到我期望的内容,我就会释放 wait() 并删除线程 THEN 然后是 worker。不确定这是否正确,但它似乎正在工作。对我来说似乎很骇人听闻,但IMO线程不应该在工人完成之前返回完成,那时似乎毫无意义。但是哦,好吧。

0 投票
1 回答
1086 浏览

c++ - QEventLoop 处理所有事件

我有一个菜单屏幕,必须在登录屏幕关闭之前更新。代码类似于下面的代码;

问题是“我如何确定所有事件都已处理?”。因为由 updateMainMenuAccordingToUserRights 信号触发的一些槽将新事件添加到事件循环以更新视图组件。在跳转主菜单之前,我必须确保它已经更新。我搜索了一下,发现 QCoreApplication::processEvent 只处理了一次循环。好的,这就是上面代码不起作用的原因。即使我尝试了一些 QEventLoop 方法,但无法解决这个问题。

感谢您的任何建议。

0 投票
1 回答
109 浏览

c++ - 在主事件循环之前如何创建一些对象?

在调试时,我想出了对我来说很奇怪的事情。在主函数中,我将窗口的创建注释如下:

我以为我只是在创建一个事件循环并开始使用它。但输出让我感到惊讶:

我有ButtonControlGestureControl类,前两行输出来自它们的构造函数。我在 MainWindow 类中使用的其他类中创建它们的对象。对我来说奇怪的是它们是在/没有 MainWindow 和事件循环之前创建的。即使我不创建QApplication对象并调用其exec()方法,也会打印他们的消息。我尝试了clean运行ning qmakerebuild,但没有成功。这里发生了什么?ButtonControlGestureControl类有什么问题?

环境:win7、Qt 5.10、MSVC 2015。


编辑

这是我的Control课:

我在我的 MainWindow 中调用这个类。(正如我从评论中了解到的,这段代码就足够了)

0 投票
1 回答
3181 浏览

c++ - 本地 QEventLoop 是如何工作的

我的问题很笼统,与QT 中QEventLoop类的使用有关。我有两个主要问题。

问题 1)它如何在 QT 内部工作(我主要关心的是为什么QEventLoop对象的执行不会阻塞 QT 应用程序主循环 - [编辑 3] 最后一条评论不正确,请参阅下面的答案)。
详情见下文。

问题2)除了阻塞之外还有其他目的吗?似乎我只能遇到将QEventLoop用于等待目的的示例。
可以用于其他用途吗?就像我们可以想象将特定事件的处理从主应用程序循环委托给本地 QEventLoop 一样吗?(不确定这个问题是否有意义)

问题1)的发展:

我对 QT 主事件循环的基本工作原理的理解如下。应用程序主事件循环(QCoreApplication::exec())从队列中抓取一个QEvent "E",并将它分派到它决定事件应该去的QObject "A"(例如,位置和 Z 值)鼠标左键按下时的QWidget)。如果我们假设对象“A”正在使用事件“E”,则调用该对象的事件方法(还有其他便利方法和事件过滤器,但我们假设事件方法在我们的例子中处理事件) - 一些处理与对象“A”相关的发生在这里 - 并返回 true。然后,QT 主事件循环开始处理队列中的下一个事件,以此类推。

但是,如果在对象“A”的事件方法的调用中有阻塞,我希望主应用程序循环被阻塞,因为它等待接收者(对象“A”)的事件方法返回。 ..
因此,例如,如果事件的处理最终调用对象“A”的方法,我们在其中创建了一个永远不会退出的本地QEventLoop,我的期望是整个应用程序停止并且不再处理任何事件,直到本地QEventLoop退出,对象“A”的事件方法返回。
否则,这是不正确的,因为我可以看到本地QEventLoop没有阻塞应用程序主事件循环......
有人可以让我更深入地了解本地QEventLoop的工作原理吗? [编辑 3] 见下面的答案,本地事件循环处理事件

---- 编辑 1 ----

很抱歉,如果我不清楚,这实际上很难用文字来解释,所以下面是一个小代码片段,以更好地说明我的问题 1

主窗口.h

主窗口.cpp

主文件

对于上面的示例,我有一个带有 2 个按钮的简单窗口,“按钮 1”(显示其状态:选中或未选中)和“按钮 2”(单击时触发本地 QEventLoop)。当我单击按钮 2 时,它会在“loop.exec()”处阻塞,即永远不会输出第二条调试消息。然后,我希望主应用程序循环也被阻止,但是,我不认为它是因为我仍然可以单击显示其状态(选中或未选中)的“按钮 1”,这意味着鼠标事件是仍由主应用程序事件循环处理。

0 投票
2 回答
411 浏览

qt - QTimer::singleshot(0) lambda 函数调用是否有替代解决方案

我刚刚实现了一个QLineEdit在获得焦点后立即选择它的文本。我创建了一个派生类并添加了

到标题。我首先尝试像这样实现它:

但它不会选择文本,显然,在selectAll()调用某些内容时尚未处理。

可行的解决方案是将selectAll()调用放入QTimer::singleShotlambda 调用中,等待时间为 0 秒,如下所示:

这允许在selectAll()调用之前处理所有内容并且一切正常。

这只是一个例子,我已经多次遇到这个问题。所以我想知道是否有一个预定义的方法告诉Qt“执行以下,但之前处理其他所有内容”?