QClipboard :: dataChanged()的槽被调用了两次

时间:2016-08-28 12:43:21

标签: python pyqt pyqt5 qt-signals qclipboard

QClipboard :: dataChanged()的插槽detectClipboardUrl有时被调用两次,当我在此代码中复制Google Chrome的地址栏中的url时,在Win7 32bit上使用PyQt5.7,Python3.5进行测试,也在Linux上进行测试薄荷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_())

1 个答案:

答案 0 :(得分: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