• 1231阅读
  • 4回复

[提问]请教QTextEdit粘贴网络图片的问题 [复制链接]

上一主题 下一主题
离线handeng
 

只看楼主 倒序阅读 楼主  发表于: 2022-10-02
大佬们好,本人Qt和C++初学者,想用QTextEdit实现一个富文本编辑器。发现QTextEdit默认不支持粘贴图片,搜了一圈找到了重写insertFromMimeData()虚函数的办法,然后我测试发现粘贴纯图和本地图文时正常,但从网页复制一段图文混合的内容这种图片不在本地的情况下,粘贴进去后图片也不能显示。所以请问如何能够从QMimeData中,拿到图片的URL去下载,并且在段落的正确位置插入对应图片?

附上输出的QMimeData截图,这段数据的hasImage()和hasUrls()都返回false:

离线snolkmg

只看该作者 1楼 发表于: 2022-10-08
QTextEdit不支持显示网络图片,只能显示本地图片
离线onlyone

只看该作者 2楼 发表于: 2022-10-08
首先要注意,QTextEdit 必须要设置为 接受富文本模式,否则你的html格式是不能被识别的。
这点很重要。富文本接受模式下,hasImage 会是为真的。

理论上可以识别到url,然后下载,保存到本地。但是不推荐这样做,这样做就很麻烦了,你确定要做一个这么麻烦的程序吗?

简单的做法是,如果是图文混排,只拷贝文字,或者只黏贴给出图片的地址。

大概片段

void MyTextEdit::insertFromMimeData(const QMimeData *source)
{
    qDebug() << source->formats();
    if (source->hasImage())
    {
        qDebug() << "hasImage-------------------" << source->text();
        QDate date = QDate::currentDate();
        QTime time = QTime::currentTime();

        QString localPicPath(QString("%1/%2_%3.png").arg(m_picDirPath).arg(date.toString("yyyy-MM-dd")).arg(time.toString("hh-mm-ss")));
        QImage img = qvariant_cast<QImage>(source->imageData());
        img.save(localPicPath);

        if (!QFile::exists(localPicPath))
        {
            return;
        }

        QUrl localPicUrl = QUrl::fromLocalFile(localPicPath);
        document()->addResource(QTextDocument::ImageResource, localPicUrl, img);

        textCursor().insertImage(localPicUrl.toString());
        //this->insertHtml(QString("<img src=\"%1\" />").arg(localPicUrl.toString()));
#if 0
        QTextImageFormat imageFormat;
        imageFormat.setName(localPicUrl.toString());
        textCursor().insertImage(imageFormat);
#endif

    }
    //这里需要UI上面接受富文本才行。从编辑框拷贝的图片,是html的格式。
    //必须要编辑框接受富文本,才能处理html格式的图片拷贝。否则编辑框中的图片,可以拷贝到qq界面,但是不能拷贝到本编辑框中
    /*else if (source->hasHtml())
    {
        qDebug() << source->html();
        QTextEdit::insertFromMimeData(source);
    }*/
    /*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 {

        QTextEdit::insertFromMimeData(source);
    }

}
离线handeng

只看该作者 3楼 发表于: 2022-10-09
回 snolkmg 的帖子
snolkmg:QTextEdit不支持显示网络图片,只能显示本地图片 (2022-10-08 10:56) 

嗯嗯这个我是知道的,所以想先拿到图片的URL,再去下载到本地
离线handeng

只看该作者 4楼 发表于: 2022-10-09
回 onlyone 的帖子
onlyone:
首先要注意,QTextEdit 必须要设置为 接受富文本模式,否则你的html格式是不能被识别的。
这点很重要。富文本接受模式下,hasImage 会是为真的。
理论上可以识别到url,然后下载,保存到本地。但是不推荐这样做,这样做就很麻烦了,你确定要做一个这么麻烦的程序吗?
.......

感谢大佬提供的思路,我这边确认过acceptRichText是true,应该是Qt只能识别到整体数据是html类型不支持其中的图片,看来“获取图片url—下载—替换url为本地路径”这些功能只能自己实现了,工作量不少还容易出bug

快速回复
限100 字节
 
上一个 下一个