1

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

4

0 回答 0