Как использовать сигнал QClipboard.dataChanged для изменения текста в буфере обмена? - PullRequest
0 голосов
/ 05 августа 2020

Я хочу заменить все круглые скобки на скобки в моем буфере обмена, поэтому у меня есть следующий код:

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) в буфере обмена. Как это реализовать?

1 Ответ

1 голос
/ 05 августа 2020

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_())
...