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

时间:2010-09-15 18:15:53

标签: c++ qt resize qtextedit

如何点击图片,从图片的一角抓住,并在QTextEdit中调整图片大小?或者至少如何获得光标/下的图像以便改变宽度和高度?

2 个答案:

答案 0 :(得分:5)

这是我实施的方式:

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);
                      }
                  }
              }
       }
}

当然我还实现了ResizeImageDialog对话框的 getNewSize(this,newImageFormat.width(),newImageFormat.height()); 函数,它获取当前图像大小并允许用户输入size,并将新图像大小作为QPair返回。这并不难。有关对话框的实现,请参阅here

答案 1 :(得分:1)

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

  1. 我已经实现了另一个小部件(继承自QWidget),它自己就像一个虚线框架。当提供正确的尺寸时,它将像图像周围的橡皮筋选择一样自我绘制,并且一旦用户结束调整橡皮筋的尺寸,将为您提供新的图像尺寸。当然,如果使用橡皮筋小部件的虚拟resizeEvent(...)函数并发出自己的信号,也可以在调整橡皮筋大小期间调整图像大小。作为橡皮筋小部件的父级,设置QTextEdi-&gt; viewport()以获得橡皮筋小部件的正确视口位置。

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

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

    要使用橡皮筋调整图像大小需要花费很多额外的精力,请阅读以上内容作为指导。我已经亲自实现了它,它可以在专业的文本编辑应用程序中使用。很抱歉没有在此处发布完整的解决方案。它很长并且有版权。希望以上指南能帮到别人。我已经测试了几个解决方案,但是这个是唯一一个提供完整的封装内部编辑器图像橡皮筋调整大小而不会弄乱QTextEdit代码和Qt库内部的解决方案。