【问题标题】:slot of QClipboard::dataChanged() was called twiceQClipboard::dataChanged() 的插槽被调用了两次
【发布时间】:2016-08-28 12:43:20
【问题描述】:

QClipboard::dataChanged() 的 slot detectClipboardUrl 有时会被调用两次,当我在这段代码中在 Google Chrome 的地址栏中复制 url 时,在 Win7 32 位上使用 PyQt5.7、Python3.5 进行了测试,也在 Linux Mint 18 上进行了测试, 虽然我只需要调用一次插槽,但这是一个错误吗?有什么解决办法吗?

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class MainWindow(QTableView):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.clipboard = QApplication.clipboard()
        self.clipboard.dataChanged.connect(self.detectClipboardUrl)  

    @pyqtSlot()
    def detectClipboardUrl(self):
        print(self.clipboard.text())



if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 真的只有谷歌浏览器地址栏受到影响吗?
  • @ekhumoro 从文本编辑中复制文本时,没有此效果
  • 所以问题出在 Chrome,而不是 Qt。

标签: python pyqt pyqt5 qt-signals qclipboard


【解决方案1】:

如果更改重复,您可以执行以下操作:

class MainWindow(QTableView):
    def __init__(self, parent=None):
    self.clipboard = QApplication.clipboard()
    self._cb_last = hash(self.clipboard.text())
    self.clipboard.dataChanged.connect(self.detectClipboardUrl)  

    @pyqtSlot()
    def detectClipboardUrl(self):
        text = self.clipboard.text()
        cb_current = hash(text)
        if cb_current != self._cb_last:
            print('clipboard text changed:', text)
            self._cb_last = cb_current

使用hash 的原因只是为了避免在内存中保留非常大的字符串。

或者,如果两个信号非常接近地到达,您可以使用QTimer 阻止在第一个信号的几毫秒内发生的任何更改。

更新

正如我所怀疑的,问题是由 Chromium 中的错误引起的:请参阅 Issue 173691

【讨论】:

  • 我猜这是一个错误
  • @iMath。可能是 Chrome 中的错误,但 Qt 中没有。
  • 我很确定你不应该像那样使用hash,因为很可能发生碰撞。 hash() 主要在内部用于 dicts,其中可以正确处理冲突。
  • @TheCompiler。嗯,“很可能”似乎有点夸张。对于像这样的非关键应用程序,使用 hash 非常好。每个会话可能只有几百次检查,而不是保证碰撞所需的几十亿次检查。如果 hash 真的像您建议的那样容易受到攻击,那么它甚至不适合与 dict 一起使用。
  • 您的答案已停止连续复制相同的文本,没有限制的更好解决方法在这里gist.github.com/redstoneleo/2ac9ca8037e1621c2f49b264573d03fc
猜你喜欢
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多