QTextEdit内拖入图片——QtWidgets

2023-12-01 03:10

本文主要是介绍QTextEdit内拖入图片——QtWidgets,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 前言

QTextEdit是用来编辑和展示文本和富文本的一个控件。我之前一直拿它当纯文本编辑器(QPlainTextEdit)使,一直没啥机会去用一下他的富文本功能。

这次有时间了,准备做一个可以添加图片的编辑框:拖入即可添加到编辑框。

 

效果图

实现的两种方式

有两种方式,一种是根据动作想到了Drag 、Drop来实现;另一种是QTextEdit自带的方法实现。

拖入、落下事件来实现

一般在光标处添加图片,代码为

  QImage img = ...textDocument->addResource(QTextDocument::ImageResource, QUrl("myimage"), img);cursor.insertImage("myimage");

 现在我们重写QTextEdit,命名为MyTextEdit,然后在落下事件中,获取MineData,将其转化为QImage,最后根据上面的方法,也就实现了拖入图片功能了

void MyTextEdit::dragEnterEvent(QDragEnterEvent *e)
{e->acceptProposedAction();
}void MyTextEdit::dropEvent(QDropEvent *e)
{QString url=e->mimeData()->urls().first().toLocalFile();if(e->mimeData()->hasImage()){//这只是个名字 供后续调用的名字QUrl name ( QString ( "file://%1" ).arg ( url ) );//获取图片 并插入到光标处QImage image = QImageReader ( url ).read();QTextDocument * textDocument = this->document();document()->addResource( QTextDocument::ImageResource, name, QVariant ( image ) );textCursor().insertImage(name.toString());}
}

QTextEdit自带的方法实现

后来,我发现QTextEdit对插入图片等数据都有固定的方法可实现。通过方法canInsertFromMimeData对插入的数据进行筛选,

然后在insertFromMimeData方法中根据不同类的数据进行操作添加。不过我经过测试发现:source->hasImage()条件的,不知情况下能满足,经过我拖入的或者复制粘贴的,都不是hasImage(),所以谁能解决我的疑问?!

bool MyTextEdit::canInsertFromMimeData(const QMimeData *source) const
{return source->hasImage()||source->hasUrls()||QTextEdit::canInsertFromMimeData(source);}void MyTextEdit::insertFromMimeData(const QMimeData *source)
{if(source->hasImage()){qDebug()<<"hasImage-------------------";static int i=1;QUrl name(QString("imgName_%1").arg(i));QImage img=qvariant_cast<QImage>(source->imageData());document()->addResource(QTextDocument::ImageResource,name,img);textCursor().insertImage(name.toString());i++;}else if (source->hasUrls()){qDebug()<<"urls-----------------------------";foreach (QUrl url, source->urls()){QFileInfo info(url.toLocalFile());if (QImageReader::supportedImageFormats().contains(info.suffix().toLower().toLatin1())){QImage image(info.filePath());if (!image.isNull()){document()->addResource(QTextDocument::ImageResource, url, image);textCursor().insertImage(url.toString());}}else{QFile file(url.toLocalFile());if(file.open(QIODevice::ReadOnly|QIODevice::Text))textCursor().insertText(file.readAll());}}}else{qDebug()<<"insertFromMimeData--------------------";QTextEdit::insertFromMimeData(source);}}

官方源码说明 

我在QTextEdit看到了以下一段话,解释了我以上两个方法的可行性:

QTextEdit also supports custom drag and drop behavior. By default, QTextEdit will insert plain text, HTML and rich text when the user drops data of these MIME types onto a document. Reimplement canInsertFromMimeData() and insertFromMimeData() to add support for additional MIME types.

还有我很好奇,QTextEdit底层是如何写的canInsertFromMimeDatainsertFromMimeData方法:它是另写了一个控制类QWidgetTextControl来操作,从以下源码中,我们可以清楚的看到它能够支持什么类型插入,还有根据不同的数据类型,进行的不同的处理,这些都是默认自带的。

bool QWidgetTextControl::canInsertFromMimeData(const QMimeData *source) const
{Q_D(const QWidgetTextControl);if (d->acceptRichText)return (source->hasText() && !source->text().isEmpty())|| source->hasHtml()|| source->hasFormat(QLatin1String("application/x-qrichtext"))|| source->hasFormat(QLatin1String("application/x-qt-richtext"));elsereturn source->hasText() && !source->text().isEmpty();
}void QWidgetTextControl::insertFromMimeData(const QMimeData *source)
{Q_D(QWidgetTextControl);if (!(d->interactionFlags & Qt::TextEditable) || !source)return;bool hasData = false;QTextDocumentFragment fragment;
#ifndef QT_NO_TEXTHTMLPARSERif (source->hasFormat(QLatin1String("application/x-qrichtext")) && d->acceptRichText) {// x-qrichtext is always UTF-8 (taken from Qt3 since we don't use it anymore).const QString richtext = QLatin1String("<meta name=\"qrichtext\" content=\"1\" />")+ QString::fromUtf8(source->data(QLatin1String("application/x-qrichtext")));fragment = QTextDocumentFragment::fromHtml(richtext, d->doc);hasData = true;} else if (source->hasHtml() && d->acceptRichText) {fragment = QTextDocumentFragment::fromHtml(source->html(), d->doc);hasData = true;} else {QString text = source->text();if (!text.isNull()) {fragment = QTextDocumentFragment::fromPlainText(text);hasData = true;}}
#elsefragment = QTextDocumentFragment::fromPlainText(source->text());
#endif // QT_NO_TEXTHTMLPARSERif (hasData)d->cursor.insertFragment(fragment);ensureCursorVisible();
}

还有就是QTextEdit支持剪贴板(clipboard)的,从源码中,你可以看到它对复制粘贴等的一系列处理。 这个我就不列举源码了。

结束语 

感觉每次深入研究一个经常用的小控件,都收获满满(*^▽^*)!

 

这篇关于QTextEdit内拖入图片——QtWidgets的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439564

相关文章

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求