我有以下简单的剪贴板观察线程/类:
import time
from PyQt4 import QtGui, QtCore
class ClipboardWatcher(QtCore.QThread):
clip_detected = QtCore.pyqtSignal(object)
def __init__(self):
QtCore.QThread.__init__(self)
self._pause = 5.
def __del__(self):
self.wait()
def run(self):
recent_value = ""
#clipboard = QtGui.QApplication.clipboard()
while True:
self.clip_detected.emit("Testing 123...")
tmp_value = ""
#tmp_value = clipboard.text()
if tmp_value != recent_value:
recent_value = tmp_value
self.clip_detected.emit(recent_value)
time.sleep(self._pause)
self.terminate()这个很好..。我的PyQt应用程序中的主小部件很好地接收到信号。但是,如果取消对行#clipboard = QtGui.QApplication.clipboard()的注释,则会得到以下错误:
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python2.7: ../../src/xcb_io.c:179: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.我是个python新手(这是我的第一个应用程序),所以不太确定我在这里做错了什么.
发布于 2014-09-12 12:19:17
我怀疑错误是因为QClipboard不是线程安全的。Qt文档没有明确说明这一点,但它确实说(参考):
最后,X11剪贴板是事件驱动的,即如果事件循环没有运行,剪贴板将无法正常工作。同样,建议存储或检索剪贴板的内容,以直接响应用户输入事件,例如鼠标按钮或按键和释放。您不应在响应计时器或非用户输入事件时存储或检索剪贴板内容。
因此,我怀疑您不应该从QThread中读取剪贴板。我建议对你的问题提出另一种解决办法。
发布于 2014-09-12 12:20:32
在文档中,
QClipboard QApplication.clipboard () 返回指向应用程序全局剪贴板的指针。 注意:--在访问剪贴板之前,应该已经构造了QApplication对象。
是否有可能在访问剪贴板之前构造QApplication对象。
https://stackoverflow.com/questions/25807679
复制相似问题