为什么我的python QObject的槽不是由emit()触发的

时间:2014-12-10 16:05:29

标签: pyqt signals qobject slot python-watchdog

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

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

可以在以下位置检查示例代码     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>

1 个答案:

答案 0 :(得分:0)

这是PEBKAC,但至少有两个有趣的功能互动。从本质上讲,emit()确实触发了插槽,但我为监控触发所做的所有尝试都存在缺陷。

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

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

相关问题