Skip to main content

Command Palette

Search for a command to run...

Insert an image into a QTextEdit

Updated
2 min read

1. Using html tag

QTextEdit *textEditor = new QTextEdit(0);
QTextDocumentFragment fragment;
fragment = QTextDocumentFragment::fromHtml("");
textEditor->textCursor().insertFragment(fragment);
textEditor->setVisible(true);

2. Using QTextDocument's resource

QString file = QFileDialog::getOpenFileName(this, tr("Select an image"),
".", tr("Bitmap Files (*.bmp)
"
"JPEG (*.jpg *jpeg)
"
"GIF (*.gif)
"
"PNG (*.png)
"));
QUrl Uri ( file );
QImage image = QImageReader ( file ).read();
QTextDocument * textDocument = m_textEdit->document();
textDocument->addResource( QTextDocument::ImageResource, Uri, QVariant ( image ) );
QTextCursor cursor = m_textEdit->textCursor();
QTextImageFormat imageFormat;
imageFormat.setWidth( image.width() );
imageFormat.setHeight( image.height() );
imageFormat.setName( Uri.toString() );
cursor.insertImage(imageFormat);

3. Subclass QTextEdit (The example below also enabled drag & drop)

class TextEdit : public QTextEdit {
public:
    bool canInsertFromMimeData( const QMimeData* source ) const
    {
        return(source->hasImage() );
    }


    void insertFromMimeData( const QMimeData* source )
    {
        if ( source->hasImage() )
        {
            static int    i = 1;
            QUrl        url( QString( "dropped_image_%1" ).arg( i++ ) );
            dropImage( url, qvariant_cast( source->imageData() ) );
        } else if ( source->hasUrls() )
        {
            foreach( QUrl url, source->urls() )
            {
                QFileInfo info( url.toLocalFile() );
                if ( QImageReader::supportedImageFormats().contains( info.suffix().toLower().toLatin1() ) )
                {
                    dropImage( url, QImage( info.filePath() ) );
                }else  {
                    dropTextFile( url );
                }
            }
        }else  {
            QTextEdit::insertFromMimeData( source );
        }
    }
}

private:
void dropImage( const QUrl & url, const QImage & image )
{
    if ( !image.isNull() )
    {
        document()->addResource( QTextDocument::ImageResource, url, image );
        textCursor().insertImage( url.toString() );
    }
}


void dropTextFile( const QUrl & url )
{
    textCursor().insertText( file.readAll() );
}
};

More from this blog

解决QWidget用winId获取HWND而导致Qt程序无事件消息的问题

问题原因: 当对一个QWidget调用winId时,默认情况下,Qt会对该窗口进行Native化,从而导致如鼠标等事件被其它原生窗口接管,表现出来的现像就是窗口不响应任何事件 解决思路: 防止Qt窗口Native化 解决办法: 第一步,在创建QApplication对象之前设置: QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); //注意:Qt::AA_NativeWindows受环境变量 QT_USE_NATI...

Jul 7, 20251 min read

解决因OpenGL渲染窗口高宽比导致图形变形

在 OpenGL 中,由于窗口的 宽高比(aspect ratio) 与绘制内容的坐标系统不一致,图像会出现拉伸、压缩等变形现象。为了解决这个问题,可根据窗口的大小调整投影矩阵,确保图像在视觉上保持原始比例。 先通过glViewPort调整视口 void resizeGL(int w, int h) { glViewport(0, 0, w, h); } 再根据窗口高宽比,计算出合适的投影矩阵,这样体现出来的样式,就是截掉了宽高比之外的内容,显示的内容不变形,正圆就是正圆,不会被拉伸成...

Jun 18, 20251 min read

cmake管理使用了qt的项目的正确使用方法

可将QT5_DIR(包括了bin/inclue/lib等目录的那个基础目录,不是lib/cmake)加到CMAKE_PREFIX_PATH中,防止find_package无法使用 cmake对qt moc有如下几个函数封装: qt_wrap_ui([输出]MOC后的源文件列表 [输入]MOC前的.ui文件) qt_wrap_cpp([输出]MOC后的源文件列表 [输入]MOC前的源文件,通常是包含了Q_OBJECT的.hpp) qt_add_resources([输出]MOC后的源文件列表 [输...

Apr 7, 20251 min read

源赖朝的部落格威力缩小版

28 posts

源赖朝的部落格威力缩小版