c++ - ¿Cómo cambiar el tamaño de una imagen en un QTextEdit?
resize (2)
Aquí cómo lo he implementado:
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);
}
}
}
}
}
Por supuesto, también he implementado getNewSize (this, newImageFormat.width (), newImageFormat.height ()) del diálogo ResizeImageDialog; función que obtiene el tamaño actual de la imagen y permite al usuario reducir el tamaño, y devuelve el nuevo tamaño de la imagen como QPair. Esto no es difícil de hacer. Vea aquí para la implementación del diálogo.
¿Cómo hacer clic en la imagen, retenerla desde una esquina y cambiar el tamaño de la imagen en QTextEdit? ¿O al menos cómo obtener una imagen debajo del cursor / que se selecciona para cambiar el ancho y el alto?
Lo anterior es un requisito bastante común, pero no es sencillo de implementar en Qt. El marco de cambio de tamaño de una imagen dentro de un QTextEdit es la parte difícil. Yo uso un enfoque diferente. Dibujé un widget encima del QTextEdit como una banda elástica alrededor de la imagen. Para lograr esto, he hecho lo siguiente:
Implementé otro widget (que hereda de QWidget) que se dibuja como un marco de líneas discontinuas. Cuando se le proporcione el tamaño correcto, se dibujará como una selección de banda elástica alrededor de la imagen y le proporcionará el nuevo tamaño de imagen, una vez que el usuario haya terminado de cambiar el tamaño de la banda elástica. Por supuesto, puede cambiar el tamaño de la imagen también durante el cambio de tamaño de la banda elástica si usa la función virtual resizeEvent (...) del widget de banda elástica y emite su propia señal. Como padre del widget de la banda elástica, establece QTextEdi-> viewport () para obtener la posición correcta de la ventana gráfica de tu widget rubberband.
Cree otra clase (MyTextEditDecorator) que simplemente herede de QObject e instálela como un filtro de eventos para el QTextEdit y la ventana QTextEdit. También proporcionará un buen aislamiento de la funcionalidad de la banda elástica del resto del código que posiblemente ya tenga. Dentro de la función MyTextEditDecorator :: eventFilter (...) capture los eventos MouseButtonPress, MouseButtonRelease, Paint y Resize. Mostrar el widget de la banda elástica, cuando un usuario hace clic dentro de un borde de imagen o imagen, es decir, cuando el formato del cursor es QTextImageFormat y lo oculta cuando el cursor de texto está fuera del formato de una imagen.
Si desea que la selección de la banda elástica aparezca cuando un usuario mueve el cursor de texto a través de un teclado, por ejemplo, es posible que desee enganchar a QTextEdit :: cursorPositionChanged (). Para mis propósitos, también necesitaba las señales currentCharFormatChanged () y textChanged () en los casos en que se ingresa texto y se crea un formato de imagen. También necesitará encontrar la posición x, y de la imagen dentro de la ventana gráfica para colocar el widget de banda elástica correctamente alrededor de la imagen. Yo uso QTextEdit :: cursorRect (imageSelectedCursor). Si admite alineaciones de imagen diferentes, prepárese para ajustarlo también. Otra función útil para encontrar posiciones de pantalla X, Y es QTextLayout :: lineForTextPosition (textCursor.position ()) para obtener la QTextLine y QTextLine :: rect () correctas.
Para obtener el cambio de tamaño de la imagen con banda elástica, se necesita un gran esfuerzo adicional y lea lo anterior como una guía. Lo he implementado personalmente y funciona en una aplicación de edición de texto profesional. Perdón por no publicar la solución completa aquí. Es largo y tiene un copyright. Espero que la guía anterior ayude a alguien. He probado varias soluciones, pero esta es la única que proporciona el cambio de tamaño completo y encapsulado de la banda elástica de la imagen del editor sin interferir con el código QTextEdit y las partes internas de la biblioteca Qt.