Domanda

Come cliccare sull'immagine, attesa da un angolo di essa, e ridimensionare l'immagine nel QTextEdit? O almeno come ottenere un'immagine sotto il cursore / selezionato al fine di modificare la larghezza e altezza?

È stato utile?

Soluzione

Ecco come ho implementato:

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

Naturalmente mi hanno messo in atto anche la finestra di dialogo ResizeImageDialog getNewSize (questo, newImageFormat.width (), newImageFormat.height ()); funzione che ottiene la dimensione attuale dell'immagine e permette all'utente di chnage la dimensioni, e restituisce la nuova dimensione di immagine come un QPair. Questo non è difficile da fare. Vedere qui per l'attuazione della finestra di dialogo.

Altri suggerimenti

È possibile che questo requisito è abbastanza comune, ma non è semplice da implementare in Qt. Il telaio ridimensionamento di un'immagine di un QTextEdit è la parte difficile. Io uso un approccio diverso. Traggo un widget in cima alla QTextEdit come un elastico intorno all'immagine. Per raggiungere questo obiettivo ho fatto quanto segue:

  1. Ho implementato un altro widget (eredita da QWidget) che si disegna come un telaio tratteggiato. Quando fornito la giusta dimensione trarrà se stesso come selezione elastico intorno all'immagine e vi fornirà la nuova dimensione dell'immagine, una volta che l'utente ha terminato il ridimensionamento l'elastico. Naturalmente si potrebbe ridimensionare l'immagine troppo durante il ridimensionamento del nastro di gomma, se si utilizza la funzione resizeEvent virtuale (...) del widget elastico ed emettere il proprio segnale. Come Widget genitore del nastro di gomma impostare il QTextEdi-> finestra () per ottenere la posizione corretta finestra di voi Rubberband gadget.

  2. Creare un'altra classe (MyTextEditDecorator) che semplicemente eredita da QObject e si installano come un filtro evento per il QTextEdit e QTextEdit viewport. Esso fornirà anche un buon isolamento della funzionalità elastico dal resto del codice si potrebbe già avere. All'interno della funzione cattura MyTextEditDecorator :: eventFilter (...) il MouseButtonPress, MouseButtonRelease, Paint e gli eventi di ridimensionamento. Mostra il widget elastico, quando un utente fa clic all'interno di un bordo all'immagine o un'immagine, vale a dire quando il formato del cursore è QTextImageFormat e nasconderlo quando il cursore del testo è al di fuori di un formato di immagine.

Se si desidera che la selezione elastico per apparire quando un utente sposta il cursore del testo tramite una tastiera, ad esempio si potrebbe desiderare di agganciare al QTextEdit :: cursorPositionChanged (). Per i miei scopi ho anche bisogno i segnali TextChanged () currentCharFormatChanged () e nei casi in cui il testo viene inserito e un formato di immagine viene creato ex novo. Sarà inoltre necessario per trovare l'immagine x, y posizione all'interno della finestra per posizionare l'elastico widget di correttamente intorno all'immagine. Io uso il QTextEdit :: cursorRect (imageSelectedCursor). Se si supportano diversi allineamenti di immagine, essere pronti a registrare per ottenere troppo. Un'altra funzione utile per trovare posizioni dello schermo X, Y è QTextLayout :: lineForTextPosition (textCursor.position ()) per ottenere la corretta QTextLine e QTextLine :: rect ().

Per ottenere il ridimensionamento delle immagini con l'elastico bisogno di un sacco di sforzo in più e leggere quanto sopra come guida. Ho implementato personalmente e funziona in un editor di testo professionale. Ci scusiamo per non inviare la soluzione completa qui. E 'lungo e ha un diritto d'autore. La speranza che la guida di cui sopra vi aiuterà qualcuno. Ho testato diverse soluzioni, ma questo è l'unico che fornisce piena e incapsulati all'interno editor di immagini elastico ridimensionamento senza fare confusione con il codice QTextEdit e gli elementi interni libreria Qt.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top