使用 PySide6 关闭 QTextEdit 对象的粘贴

Turn off pasting for QTextEdit object using PySide6

我正在尝试关闭 QtWidgets.QtextEdit 对象 (PySide6) 的粘贴功能,但我很困惑它是否在跨平台默认情况下处于关闭状态。例如,我凭直觉认为以下方法可行:

class MyEditor(QtWidgets.QTextEdit):
    def _setup_interface(self):
        self.canPaste(False)

但这会导致错误,因为 QtWidgets.QTextEdit.canPaste 不接受参数。有没有办法明确关闭粘贴,或者我需要相信它会默认关闭?

应用参数或属性的函数名称通常以 set.
开头 canPaste() 只是告诉剪贴板的内容是否可以用于粘贴文本编辑。

解决方案是覆盖 insertFromMimeData(),每次尝试 粘贴 内容时都会调用它,什么也不做:

class NoPasteTextEdit(QtWidgets.QTextEdit):
    def insertFromMimeData(self, source):
        pass

请注意,上下文菜单仍会显示“粘贴”操作,因此您可能应该禁用它,这可以通过重写 canInsertFromMimeData() 并始终返回 False:

来实现
    def canInsertFromMimeData(self, source):
        return False

不过请注意,这将完全损害通过剪贴板进行内部编辑的默认行为,包括拖动文本选择以将其移动到另一个位置。

一个可能的替代方案是覆盖createMimeDataFromSelection(),获取默认实现的QMimeData并添加自定义格式,这样我们可以检查insertFromMimeData()canInsertFromMimeData()是否“粘贴”的数据是否在内部生成并最终接受或忽略它。

class NoPasteTextEdit(QtWidgets.QTextEdit):
    def canInsertFromMimeData(self, source):
        return source.hasFormat('InternalClipboard')

    def insertFromMimeData(self, source):
        if source.hasFormat('InternalClipboard'):
            super().insertFromMimeData(source)

    def createMimeDataFromSelection(self):
        # the mime object returned from the default implementation does
        # not allow to set further arbitrary data, so we just create a
        # standard QMimeData and fill it with the existing data
        mime = QtCore.QMimeData()
        src = super().createMimeDataFromSelection()
        for fmt in src.formats():
            mime.setData(fmt, src.data(fmt))
        mime.setData('InternalClipboard', QtCore.QByteArray())
        return mime