• 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

  • 相关阅读:
    在ts+vue中实现前端批量下载打包二维码
    常用到的MD5加密
    Permission denied Command PhaseScriptExecution failed with a nonzero exit code
    iOS App 内购 Demo
    App 上架遇到的坑
    基于StreamingKit的音频播放器
    iOS 添加多图片加签名
    xcode10 自定义代码块
    xcode10 之后代码不联想
    Mac 开发PHP 使用ThinkPHP
  • 原文地址:https://www.cnblogs.com/muyr/p/3621601.html
Copyright © 2020-2023  润新知