2010-09-15 6 views

Répondre

5

Voici comment je l'ai mis en œuvre:

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

Bien sûr, je l'ai mis en œuvre également getNewSize de la boîte de dialogue ResizeImageDialog (ce, newImageFormat.width(), newImageFormat.height()); fonction qui obtient la taille actuelle de l'image et permet à l'utilisateur de chnage la taille, et renvoie la nouvelle taille de l'image en tant que QPair. Ce n'est pas difficile à faire. Voir here pour la mise en œuvre de la boîte de dialogue.

1

Ce qui précède est une exigence assez courante, mais pas simple à mettre en œuvre dans Qt. Le cadre de redimensionnement d'une image dans un QTextEdit est la partie délicate. J'utilise une approche différente. Je dessine un widget au-dessus du QTextEdit comme un élastique autour de l'image. Pour ce faire, je l'ai fait ce qui suit:

  1. J'ai mis en place un autre widget (héritant de QWidget) qui se dessine comme un cadre en pointillés. Lorsqu'elle est fournie à la bonne taille, elle se dessine comme une sélection élastique autour de l'image et vous fournira la nouvelle taille d'image, une fois que l'utilisateur a terminé de redimensionner l'élastique. Bien sûr, vous pouvez également redimensionner l'image lors du redimensionnement de la bande élastique si vous utilisez la fonction virtuelle resizeEvent (...) du widget élastique et que vous émettez votre propre signal. En tant que parent du widget élastique, définissez QTextEdi-> viewport() pour obtenir la position correcte de la fenêtre de votre widget élastique.

  2. Créer une autre classe (MyTextEditDecorator) qui hérite simplement de QObject et installer lui-même comme un filtre d'événements pour l'QTextEdit et la fenêtre QTextEdit. Il fournira également une bonne isolation de la fonctionnalité élastique du reste du code que vous pourriez avoir déjà. Dans la fonction MyTextEditDecorator :: eventFilter (...), les événements MouseButtonPress, MouseButtonRelease, Paint et Resize sont interceptés. Afficher le widget élastique, lorsqu'un utilisateur clique dans une bordure d'image ou d'image, c'est-à-dire lorsque le format du curseur est QTextImageFormat et le cache lorsque le curseur de texte est en dehors d'un format d'image.

Si vous voulez que la sélection de bande de caoutchouc apparaisse lorsqu'un utilisateur déplace le curseur de texte via un clavier par exemple, vous pouvez accrocher à la QTextEdit :: cursorPositionChanged(). Pour mes besoins, j'ai également besoin des signaux currentCharFormatChanged() et textChanged() dans les cas où du texte est entré et qu'un format d'image est nouvellement créé. Vous aurez également besoin de trouver la position de l'image x, y dans la fenêtre pour positionner le widget élastique correctement autour de l'image. J'utilise le QTextEdit :: cursorRect (imageSelectedCursor). Si vous supportez différents alignements d'image, soyez prêt à l'ajuster aussi. Une autre fonction utile pour trouver les positions d'écran X, Y est QTextLayout :: lineForTextPosition (textCursor.position()) pour obtenir la bonne QTextLine et QTextLine :: rect(). Pour obtenir le redimensionnement de l'image avec de la bande de caoutchouc, il faut beaucoup d'efforts et lisez le guide ci-dessus. Je l'ai implémenté personnellement et cela fonctionne dans une application d'édition de texte professionnelle. Désolé de ne pas poster la solution complète ici. C'est long et a un droit d'auteur. J'espère que le guide ci-dessus aidera quelqu'un. J'ai testé plusieurs solutions, mais celle-ci est la seule qui offre un redimensionnement complet et encapsulé à l'intérieur de l'éditeur de bande de caoutchouc sans avoir à manipuler le code QTextEdit et les internes de la librairie Qt.

Questions connexes