使用 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
我正在尝试关闭 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