从副本上的QPlainTextEdit获取原始文本

2024-04-19 07:44:02 发布

您现在位置:Python中文网/ 问答频道 /正文

从QPlainTextEdit复制时,我希望获得没有样式信息的原始文本。当前,从QPlainTextEdit粘贴到excel时,包含样式信息。我用的是PySide2。你知道吗

下面是一张excel的图片来说明这个问题

我最初将A列的背景色设置为黄色,并粘贴在该列的顶部。你知道吗

我已经尝试重新实现createMimeDataFromSelection,但是如果我创建了一个新的qimedata,设置文本并返回它,程序就会崩溃,没有错误。经过进一步的测试,这个方法确实有效,并且在使用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_())


Tags: text文本selfinitdefmimesuperpyside2