QTextEdit的paste

By 鬼猫猫 20130117 http://www.cnblogs.com/muyr/

背景

QTextEdit中粘贴一大段文字时,EasyDraft中粘贴进去的文字们的格式就乱了,处于无格式。还有在EasyDraft中选中一些文字进行拖放动作时,格式也会混乱。

解决

这两种都牵涉到QTextEdit粘贴行为,我们可以截获剪切板(clipboard)的内容,然后自行修改调整格式,再手动插入到QTextEdit中。正好,QTextEdit提供了对应的保护成员函数:insertMimeData()

virtual void insertFromMimeData( const QMimeData * source)

于是我们重现实现该函数

void EDTextEdit::insertFromMimeData( const QMimeData *source) {

    if (source->hasText() ) {
        QString context = source->text();
        QStringList conList = context.split("
");
        QTextCursor cursor = this->textCursor();

        int origState = cursor.block().userState();

        for (int i = 0; i < conList.length(); ++i) {
            cursor.insertBlock(/* 格式设置在此 */);
            cursor.insertText(conList[i]); //插入文本内容
            cursor.block().setUserState(origState);
        }
    }
}

20130118补充:

这样在编辑框中复制粘贴本身的内容,原有的剧本元素格式也全部被弄成了光标处的格式了,所以我们应该判断一下,如果内容包含了剧本格式,那么就执行默认粘贴行为。

怎样判断该内容包含了剧本格式呢,我们使用source->formats()函数,打印出了当这种情况时,格式列表,放回内容为("text/html", "application/vnd.oasis.opendocument.text", "text/plain"),这里的"application/vnd.oasis.opendocument.text"应该就是我们的格式,所有若source的格式包含了该格式,就执行默认行为

void EDTextEdit::insertFromMimeData( const QMimeData *source) {
    if (source->hasText() && !source->hasFormat("application/vnd.oasis.opendocument.text")) {
        // 修改格式并插入到文档中,代码同上
    } else {
        // 默认行为
        QTextEdit::insertFromMimeData(source);
    }
}

说一下这个QMimeData的hasFormat()函数,给它一个Qt识别的格式的字符串,比如"text/plain","text/html","text/uri-list", "application/x-qt-image"等等,你可以使用QMimeData::formats()函数来查看。

Qt文档中的说明

Drag and Drop

QTextEdit支持用户自定义的drag和drop行为.

默认情况下,当用户drop一些纯文本,HTML,富文本这种MIME数据时,QTextEdit会直接插入到文档中。

你可以通过重新实现 canInsertFromMimeData()insertFromMimeData() 来支持额外的MIME数据类型

例如,允许用户拖拽图片到QTextEdit里,你可以这么实现:

bool TextEdit::canInsertFromMimeData( const QMimeData *source ) const {
    if (source->hasImage())
        return true;
    else
        return QTextEdit::canInsertFromMimeData(source);
    }

这样,使其返回true,我们就增加支持了image MIME types. 其他的MIME类型,我们使用默认的实现.

void TextEdit::insertFromMimeData( const QMimeData *source ) {
    if (source->hasImage()) {
        QImage image = qvariant_cast<QImage>(source->imageData());
        QTextCursor cursor = this->textCursor();
        QTextDocument *document = this->document();
        document->addResource(QTextDocument::ImageResource, QUrl("image"), image);
        cursor.insertImage("image");
    }
}

我们从QVariant中解包图像数据,并把它作为一个resource插入到文档中。

Powered by Sublog

原文地址:https://www.cnblogs.com/muyr/p/3621601.html