簡體   English   中英

如何在 QTextEdit 中調整圖像大小?

[英]How to resize an image in a QTextEdit?

如何單擊圖像,從它的一角按住,並在 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);
                      }
                  }
              }
       }
}

當然我還實現了ResizeImageDialog對話框的getNewSize(this,newImageFormat.width(),newImageFormat.height()); 獲取當前圖像大小並允許用戶輸入大小的函數,並將新圖像大小作為QPair返回。 這並不難。 請參閱此處以了解對話框的實現。

以上是相當普遍的要求,但不能直接在Qt中實施。 QTextEdit中圖像的大小調整框架是棘手的部分。 我使用不同的方法。 我在QTextEdit上繪制一個小部件,作為圖像周圍的橡皮筋。 為此,我做了以下事情:

  1. 我已經實現了另一個小部件(繼承自QWidget),它自己就像一個虛線框架。 當提供正確的尺寸時,它將像圖像周圍的橡皮筋選擇一樣自我繪制,並且一旦用戶結束調整橡皮筋的尺寸,將為您提供新的圖像尺寸。 當然,如果使用橡皮筋小部件的虛擬resizeEvent(...)函數並發出自己的信號,也可以在調整橡皮筋大小期間調整圖像大小。 作為橡皮筋小部件的父級,設置QTextEdi-> viewport()以獲得橡皮帶小部件的正確視口位置。

  2. 創建另一個簡單地繼承自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 中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM