Как изменить размер изображения в QTextEdit? - PullRequest
4 голосов
/ 15 сентября 2010

Как щелкнуть изображение, удерживать его в углу и изменить размер изображения в QTextEdit?Или хотя бы как получить изображение под курсором / которое выбрано для изменения ширины и высоты?

Ответы [ 2 ]

5 голосов
/ 20 октября 2010

Вот как я реализовал:

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

Конечно, я также реализовал функцию getNewSize (this, newImageFormat.width (), newImageFormat.height ()); в диалоговом окне ResizeImageDialog *1005*, которая получает текущий размер изображения и позволяет пользователю изменять размер и возвращает новый размер изображения как QPair. Это не сложно сделать. См. здесь для реализации диалога.

1 голос
/ 09 сентября 2014

Вышеприведенное является довольно распространенным требованием, но его не так просто реализовать в Qt. Кадр изменения размера изображения внутри QTextEdit - сложная часть. Я использую другой подход. Я рисую виджет поверх QTextEdit в виде круглой резинки вокруг изображения. Для этого я сделал следующее:

  1. Я реализовал другой виджет (унаследованный от QWidget), который рисует себя как рамка из пунктирной линии. Когда предоставлен правильный размер, он будет рисовать себя как выделение круглой резинки вокруг изображения и предоставит вам новый размер изображения, как только пользователь закончит изменение размера круглой резинки. Конечно, вы можете изменить размер изображения и во время изменения размера резиновой ленты, если вы используете виртуальную функцию resizeEvent (...) виджета с резиновой лентой и излучаете свой собственный сигнал. Как родитель для виджета с резинкой, установите QTextEdi-> viewport (), чтобы получить правильную позицию видового экрана вашего виджета с резинкой.

  2. Создайте другой класс (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.

...