4

QTextEditで画像をクリックし、画像の隅から押したまま、画像のサイズを変更するにはどうすればよいですか?または、少なくとも幅と高さを変更するために選択されたカーソルの下の画像を取得する方法は?

4

3 に答える 3

6

これが私がどのように実装したかです:

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として返す関数。これは難しいことではありません。ダイアログの実装については、ここを参照してください。

于 2010-10-20T10:47:19.840 に答える
4

上記は非常に一般的な要件ですが、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画面位置を見つけるためのもう1つの便利な関数は、適切なQTextLineおよびQTextLine :: rect()を取得するためのQTextLayout :: lineForTextPosition(textCursor.position())です。

ラバーバンドを使用して画像のサイズを変更するには、多くの追加の作業が必要です。ガイドとして上記をお読みください。私はそれを個人的に実装し、プロのテキスト編集アプリケーションで動作します。ここに完全なソリューションを投稿しなかったことをお詫びします。長くて著作権があります。上記のガイドが誰かを助けることを願っています。私はいくつかのソリューションをテストしましたが、これは、QTextEditコードとQtライブラリの内部をいじることなく、エディターイメージのラバーバンドのサイズ変更を完全かつカプセル化して提供する唯一のソリューションです。

于 2014-09-09T11:46:48.310 に答える
0

質問は少し古いですが、私は同じ問題を抱えていて、過去4週間私を悩ませてきました。完成した無料の実装は次の場所にあります: https ://github.com/partsoft-de/cutex 関連するクラスはQxMouseGripBandで、QxTextEditで使用されます。

于 2021-11-08T18:31:25.563 に答える