代码之家  ›  专栏  ›  技术社区  ›  D. .J. Teal

使用PySide6关闭QTextEdit对象的粘贴

  •  0
  • D. .J. Teal  · 技术社区  · 2 年前

    我正在尝试关闭粘贴一段时间 QtWidgets.QtextEdit 对象(PySide6),但我不清楚它是否在默认情况下跨平台关闭。例如,我直觉上认为以下方法可行:

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

    但这会导致一个错误,因为 QtWidgets.QTextEdit.canPaste 不需要争论。有没有办法明确关闭粘贴,或者我需要相信它在默认情况下会关闭?

    0 回复  |  直到 2 年前
        1
  •  0
  •   musicamante    2 年前

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

    解决办法是覆盖 insertFromMimeData() ,每当有人试图 粘贴 满足,什么都不做:

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

    请注意,上下文菜单仍将显示“粘贴”操作,因此您可能应该禁用该操作,这可以通过覆盖 canInsertFromMimeData() 而且总是返回错误:

        def canInsertFromMimeData(self, source):
            return False
    

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

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

    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