首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从QtCore.QThread的run方法访问QtCore.QThread

从QtCore.QThread的run方法访问QtCore.QThread
EN

Stack Overflow用户
提问于 2014-09-12 11:50:38
回答 2查看 411关注 0票数 0

我有以下简单的剪贴板观察线程/类:

代码语言:javascript
复制
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()的注释,则会得到以下错误:

代码语言:javascript
复制
[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新手(这是我的第一个应用程序),所以不太确定我在这里做错了什么.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-12 12:19:17

我怀疑错误是因为QClipboard不是线程安全的。Qt文档没有明确说明这一点,但它确实说(参考):

最后,X11剪贴板是事件驱动的,即如果事件循环没有运行,剪贴板将无法正常工作。同样,建议存储或检索剪贴板的内容,以直接响应用户输入事件,例如鼠标按钮或按键和释放。您不应在响应计时器或非用户输入事件时存储或检索剪贴板内容。

因此,我怀疑您不应该从QThread中读取剪贴板。我建议对你的问题提出另一种解决办法。

票数 0
EN

Stack Overflow用户

发布于 2014-09-12 12:20:32

文档中,

QClipboard QApplication.clipboard () 返回指向应用程序全局剪贴板的指针。 注意:--在访问剪贴板之前,应该已经构造了QApplication对象。

是否有可能在访问剪贴板之前构造QApplication对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25807679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档