如何单击图像,从它的一角按住,并在 QTextEdit 中调整图像的大小?或者至少如何获得光标下的图像/为了改变宽度和高度而被选中?
3 回答
这里我是如何实现的:
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()); 获取图像的当前大小并让用户更改大小的函数,并将图像的新大小作为 QPair 返回。这并不难做到。有关对话框的实现,请参见此处。
以上是很常见的要求,但不能直接在 Qt 中实现。QTextEdit 中图像的大小调整框架是棘手的部分。我使用不同的方法。我在 QTextEdit 的顶部绘制了一个小部件作为图像周围的橡皮筋。为了实现这一点,我做了以下事情:
我已经实现了另一个像虚线框一样绘制自身的小部件(继承自 QWidget)。当提供正确的尺寸时,它会像在图像周围选择橡皮筋一样绘制自己,一旦用户结束调整橡皮筋的大小,它就会为您提供新的图像尺寸。当然,如果您使用橡皮筋小部件的虚拟 resizeEvent(...) 函数并发出您自己的信号,您也可以在调整橡皮筋大小的过程中调整图像大小。作为橡皮筋小部件的父级,设置 QTextEdi->viewport() 以获得橡皮筋小部件的正确视口位置。
创建另一个简单地从 QObject 继承的类(MyTextEditDecorator),并将其自身安装为 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 库内部的解决方案。
这个问题有点老了,但我遇到了同样的问题,过去 4 周一直困扰着我。你可以在这里找到我完成的免费实现: https ://github.com/partsoft-de/cutex 相关的类是 QxMouseGripBand 并在 QxTextEdit 中使用。