欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

qtextedit 默认文案_QTextEdit的paste

发布时间:2024/9/27 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 qtextedit 默认文案_QTextEdit的paste 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

背景

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("\n");

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(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

总结

以上是生活随笔为你收集整理的qtextedit 默认文案_QTextEdit的paste的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。