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