0

我有 python 文件系统(看门狗)代码成功地从它自己的线程触发了 pyqtSignal#emit() 调用(由 pdb 跟踪证明)。

这个信号应该通过 connect(...) 连接到我自己的 QObject 上相应的 @pyqtSlot 函数,但实际上,当文件系统更改触发发射时,目标函数从未被调用。

示例代码可以在 https://github.com/cefn/xmlorgmode/blob/2b97ff9994132def035d325fc7f7095c9fe187f2/index.py查看

并且可以如下调用,从同一个文件夹传入一个 XML 文件和一个 XQuery 文件。

python index.py index.xml index.xq

这是第一次完美加载,但文件系统触发时不会发生刷新,如果我的代码有效,这是我所期望的。失败是沉默的。

谁能建议我需要的额外事件循环结构,看门狗触发的发射对应于对 QueryDisplay#update(...) 的调用?

背景

我一直在尝试将动态构造的 HTML 传递给由文件夹中的文本文件支持的 QWebView,这些文本文件偶尔会发生变化。由于 QWebView#setHtml(...) 在其自己的线程中调用的要求,我不得不尝试找出信号和插槽,并且我遇到了障碍。我到达的线程安排不知何故坏了,但我不知道是怎么回事。

我无法确定我的 QObject 应该如何与适当线程中的事件循环相关联,以便可以处理发出的事情。调试运行代码后,QApplication、QWebView 和我的 QObject 在与 pdb 交互调用 #thread() 以建立亲和力时都共享同一个线程,就在进入 app.exec_() 循环之前。我认为这意味着所有这些对象的所有事件都将在 app.exec_() 中处理,但我一定以某种方式误解了模型。

(Pdb) adaptor.thread()
<PyQt4.QtCore.QThread object at 0xb30c3c44>
(Pdb) display.view.thread()
<PyQt4.QtCore.QThread object at 0xb30c3c44>
(Pdb) app.thread()
<PyQt4.QtCore.QThread object at 0xb30c3c44>
4

1 回答 1

0

这是 PEBKAC,但至少有两个有趣的特征交互。本质上,emit() 确实触发了插槽,但我为监控触发所做的所有尝试都是有缺陷的。

首先,如果断点不在主线程中,PDB 会简单地忽略它们。它们永远不会被触发,即使这些代码行实际执行,如果它发生在另一个线程中。这是一个极坏的消息,但更糟糕的是,是无声的失败。一种解决方法是手动更改代码以内联调用 PDB,而不是使用调试器 shell,但这违背了让调试器调查控制流的目的。出于这个原因,即使有断点,我也没有看到调用实际发生。

其次,QXMLQuery 自动忽略对文件和缓存的更改,因此即使它被重新调用,并且底层的“焦点”文件实际上已经更改,它也会忽略这些更改。出于这个原因,我看不到触发交互的结果(缓存阻止了更改的出现)。

于 2014-12-18T12:50:05.793 回答