如何使用 QClipboard.dataChanged 信号更改剪贴板中的文本?

How to use QClipboard.dataChanged signal to change the text in clipboard?

我想将剪贴板中的所有 括号 替换为 括号,所以我在下面有这样的代码:

import sys
from functools import partial

from PyQt5 import QtWidgets


def fun(clipboard):
    text=clipboard.text()
    new_tex=text.replace("(","[").replace(")","]")
    clipboard.setText(new_tex)
    print("content:",text)
    print("content:",new_tex)

app = QtWidgets.QApplication(sys.argv)

clipboard = app.clipboard()
clipboard.dataChanged.connect(partial(fun,clipboard))

sys.exit(app.exec_())

但我注意到当我在插槽函数中使用 clipboard.setText 时,它会触发信号 两次 或更多....例如我复制文本 bb(1,2,3),那么这是我的输出:

content: bb(1,2,3)
content: bb[1,2,3]
content: 
content:

它会清除我所有的剪​​贴板,但实际上我只是想用bb[1,2,3]替换剪贴板中原来的bb(1,2,3),如何实现?

clipboard.setText触发信号QClipboard::dataChanged().

您需要删除 clipboard.setText,或者这样做:

import sys
from functools import partial
from PyQt5 import QtWidgets


def fun(clipboard):
    if not clipboard.text():                            # +
        return                                          # +

    text = clipboard.text()
    new_tex = text.replace("(","[").replace(")","]")
    clipboard.setText(new_tex)                          # <---
    print("content: 1 ", text)
    print("content: 2 ", new_tex)


app = QtWidgets.QApplication(sys.argv)

clipboard = app.clipboard()
clipboard.dataChanged.connect(partial(fun, clipboard))

sys.exit(app.exec_())

我使用一个信号来连接调用 setText() 的方法,并在一个单独的 thread.This 对我有用的数据上发送带有文本更改的信号。