从 QPlainTextEdit 复制时,我想获得没有样式信息的原始文本。目前,当从 QPlainTextEdit 粘贴到 excel 中时,会包含样式信息。我正在使用 PySide2。
这是说明问题的excel图像
我最初将 A 列的背景颜色设置为黄色并粘贴在该列的顶部。
我尝试重新实现 createMimeDataFromSelection,但如果我创建一个新的 QMimeData,设置文本并返回它,程序崩溃而没有错误。经过进一步测试,此方法确实有效,并且在使用 PyQt5 而不是 PySide2 时不会崩溃。也许这是 PySide2 的一个错误。
def createMimeDataFromSelection(self):
mime = QMimeData()
text = self.textCursor().selectedText()
mime.setText(text)
return mime #Crashes
如果我使用 super() 获取父级的 QMimeData 并使用 setText() 和 setHtml() 覆盖文本,当我复制时,我仍然会得到带有样式的原始文本:
def createMimeDataFromSelection(self):
mime = super().createMimeDataFromSelection()
mime.clear()
mime.setData("text/plain", b"")
mime.setText(self.textCursor().selectedText())
mime.setHtml("")
return mime #Copied string still contains styling information
这是一个完整的示例,展示了标准 QPlainTextEdit,一个尝试替换父类提供的 mime 数据,一个尝试创建自己的 mime 数据。
import sys
from PySide2.QtWidgets import QWidget, QPlainTextEdit, QApplication, QVBoxLayout
from PySide2.QtCore import QMimeData
class TextEditRemoveMime1(QPlainTextEdit):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def createMimeDataFromSelection(self):
mime = super().createMimeDataFromSelection()
mime.clear()
mime.setData("text/plain", b"")
mime.setText(self.textCursor().selectedText())
mime.setHtml("")
return mime
class TextEditRemoveMime2(QPlainTextEdit):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def createMimeDataFromSelection(self):
mime = QMimeData()
text = self.textCursor().selectedText()
mime.setText(text)
return mime
class Example(QWidget):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
# Has styling information
plainTextEdit = QPlainTextEdit(self)
vbox.addWidget(plainTextEdit)
# Still has styling information
plainTextEdit = TextEditRemoveMime1(self)
vbox.addWidget(plainTextEdit)
# Crashes in PySide2, but does remove styling and does not crash in PyQt5
plainTextEdit = TextEditRemoveMime2(self)
vbox.addWidget(plainTextEdit)
self.setLayout(vbox)
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())