C++ 如何在QTextEdit中调整图像的大小?

C++ 如何在QTextEdit中调整图像的大小?,c++,qt,resize,qtextedit,C++,Qt,Resize,Qtextedit,如何在QTextEdit中单击图像、从图像的一角按住并调整图像大小?或者至少如何在光标/下选择图像以更改宽度和高度?以下是我如何实现的: void AdvancedTextEdit::resizeImage() { QTextBlock currentBlock = m_textEdit->textCursor().block(); QTextBlock::iterator it; for (it = currentBlock.begin(); !(it.atE

如何在QTextEdit中单击图像、从图像的一角按住并调整图像大小?或者至少如何在光标/下选择图像以更改宽度和高度?

以下是我如何实现的:

void AdvancedTextEdit::resizeImage()
{

    QTextBlock currentBlock = m_textEdit->textCursor().block();
    QTextBlock::iterator it;

    for (it = currentBlock.begin(); !(it.atEnd()); ++it)
    {

             QTextFragment fragment = it.fragment();



             if (fragment.isValid())
             {

                 if(fragment.charFormat().isImageFormat ())
                 {
                      QTextImageFormat newImageFormat = fragment.charFormat().toImageFormat();

                      QPair<double, double> size = ResizeImageDialog::getNewSize(this, newImageFormat.width(), newImageFormat.height());

                      newImageFormat.setWidth(size.first);
                      newImageFormat.setHeight(size.second);

                      if (newImageFormat.isValid())
                      {
                          //QMessageBox::about(this, "Fragment", fragment.text());
                          //newImageFormat.setName(":/icons/text_bold.png");
                          QTextCursor helper = m_textEdit->textCursor();

                          helper.setPosition(fragment.position());
                          helper.setPosition(fragment.position() + fragment.length(),
                                              QTextCursor::KeepAnchor);
                          helper.setCharFormat(newImageFormat);
                      }
                  }
              }
       }
}
void AdvancedTextEdit::resizeImage()
{
QTextBlock currentBlock=m_textEdit->textCursor().block();
QTextBlock::迭代器;
对于(it=currentBlock.begin();!(it.atEnd());+it)
{
QTextFragment=it.fragment();
if(fragment.isValid())
{
if(fragment.charFormat().isImageFormat())
{
QTextImageFormat newImageFormat=fragment.charFormat().toImageFormat();
QPair size=ResizeImageDialog::getNewSize(这是newImageFormat.width(),newImageFormat.height());
newImageFormat.setWidth(size.first);
newImageFormat.setHeight(size.second);
if(newImageFormat.isValid())
{
//QMessageBox::about(这个“片段”,Fragment.text());
//newImageFormat.setName(“:/icons/text_bold.png”);
QTextCursor helper=m_textEdit->textCursor();
setPosition(fragment.position());
helper.setPosition(fragment.position()+fragment.length(),
QTextCursor::KeepAnchor);
setCharFormat(newImageFormat);
}
}
}
}
}

当然,我还实现了ResizeImageDialog对话框的getNewSize(这是newImageFormat.width(),newImageFormat.height());函数,该函数获取图像的当前大小并允许用户更改大小,然后将图像的新大小作为QPair返回。这并不难做到。有关该对话框的实现,请参见。

以上是非常常见的要求,但在Qt中实现并不直接。QTextEdit中图像的大小调整帧是一个棘手的部分。我使用不同的方法。我在QTextEdit顶部绘制一个小部件,作为图像周围的橡皮筋。为此,我做了以下工作:

  • 我实现了另一个小部件(继承自QWidget),它像虚线框一样绘制自身。当提供正确的尺寸时,它会像橡皮筋一样在图像周围绘制自己,并在用户结束调整橡皮筋大小后为您提供新的图像尺寸。当然,如果使用橡皮筋小部件的virtualresizeevent(…)函数并发出自己的信号,则在调整橡皮筋大小的过程中也可能调整图像的大小。作为橡皮筋小部件的父级,设置QTextEdi->viewport(),以获得橡皮筋小部件的正确视口位置

  • 创建另一个类(MyTextEditDecorator),该类仅从QObject继承,并将自身安装为QTextEdit和QTextEdit视口的事件过滤器。它还将提供橡皮筋功能与您可能已经拥有的其他代码的良好隔离。在MyTextEditDecorator::eventFilter(…)函数中,捕捉MouseButtonPress、MouseButtonRelease、Paint和Resize事件。当用户在图像或图像边框内单击时,即当光标格式为QTextImageFormat时,显示橡皮筋小部件;当文本光标位于图像格式之外时,隐藏橡皮筋小部件

  • 例如,如果希望在用户通过键盘移动文本光标时显示橡皮筋选择,则可能需要挂接到QTextEdit::cursorPositionChanged()。出于我的目的,我还需要currentCharFormatChanged()和textChanged()信号,以便在输入文本和新创建图像格式时使用。您还需要在视口中找到图像的x、y位置,以便在图像周围正确放置橡皮筋小部件。我使用QTextEdit::cursorRect(imageSelectedCursor)。如果您支持不同的图像对齐方式,也要做好调整的准备。另一个查找X、Y屏幕位置的有用函数是QTextLayout::lineForTextPosition(textCursor.position()),用于获取正确的QTextLine和QTextLine::rect()

    要使用橡皮筋调整图像大小,需要付出很多额外的努力,请阅读以上内容作为指导。我亲自实现了它,它在一个专业的文本编辑应用程序中工作。很抱歉,没有在此发布完整的解决方案。它很长,有版权。希望上面的指南能对大家有所帮助。我已经测试了几个解决方案,但这是唯一一个在不影响QTextEdit代码和Qt库内部的情况下提供完整和封装的内部编辑器图像橡皮筋大小调整的解决方案