2015-11-29 14 views
8

TL; DR: TextEdit dipinge il testo evidenziato solo quando si fa clic su di esso. Nulla aiutaImpossibile evidenziare l'elaborazione su TextEdit

Ho un ListView con un modello QAbstractListModel con proprietà di stringa. Queste proprietà delle stringhe vengono sottoposte a controllo ortografico e QSyntaxHighlighter viene utilizzato per mostrare gli errori ortografici. Creo il discendente QSyntaxHighlighter in Component.onCompleted di TextEdit. Ho ricontrollato l'evidenziazione di ottenere eseguito con errori ortografici corretti e setFormat() di Evidenziatore viene eseguito con le posizioni corrette. Il problema è che disegna il testo in rosso (invalida) solo quando clicco sullo TextEdit stesso.

TextEdit vive in un (cursore traccia) Flickable e Flickable vive in un Rectangle (per avere bel sfondo e il bordo). Il collegamento ad alcuni segnali e il richiamo dell'aggiornamento() di TextEdit non sono di aiuto.

Dopo il controllo ortografico, emetto il segnale rehighlight() di SyntaxHighlighter creato.

Rectangle { 
    id: descriptionRect 
    height: 30 
    border.width: descriptionTextInput.activeFocus ? 1 : 0 
    clip: true 

    Flickable { 
     id: descriptionFlick 
     contentWidth: descriptionTextInput.paintedWidth 
     contentHeight: descriptionTextInput.paintedHeight 
     anchors.fill: parent 
     interactive: false 
     flickableDirection: Flickable.HorizontalFlick 
     height: 30 
     clip: true 
     focus: false 

     function ensureVisible(r) { 
      if (contentX >= r.x) 
       contentX = r.x; 
      else if (contentX+width <= r.x+r.width) 
       contentX = r.x+r.width-width; 
     } 

     TextEdit { 
      id: descriptionTextInput 
      width: descriptionFlick.width 
      height: descriptionFlick.height 
      text: description 
      onTextChanged: model.editdescription = text 

      Component.onCompleted: { 
       globalModel.initDescriptionHighlighting(index, descriptionTextInput.textDocument) 
      } 

      onCursorRectangleChanged: descriptionFlick.ensureVisible(cursorRectangle) 
     } 
    } 
} 

Ecco un piccolo esempio di progetto con dimostrazione di come non funziona fino a quando si fa clic su un testo https://bitbucket.org/ribtoks/rehighlighdemo/src

Tutte le idee come posso risolvere questo problema?

+1

ho costruito ed eseguito la vostra fonte, ma il programma funziona come vi aspettavate. le parole vengono evidenziate subito dopo aver fatto clic sul pulsante di controllo ortografico. Ho usato Qt 5.5.1 su OSX – DenimPowell

+0

Tutto funziona come previsto, prova a ricostruire il progetto con make disclean && qmake && make ' – swex

+0

Non funziona per Qt 5.4 di sicuro. Con o senza pulizia e qmaking. Potrebbe funzionare su 5.5.1. Ma ho bisogno di mantenere una compatibilità nel mio prodotto fino a Qt 5.2, che avrebbe bisogno di alcuni hack e 5.4 – Ribtoks

risposta

0

Il problema è stato probabilmente causato da QTBUG-44765, corretto in Qt 5.5.

Dato il basso livello del bug, non penso che sia praticamente ovvio.

È possibile risolvere che aggiungendo una stringa vuota al TextEdit quando hai finito con l'evidenziazione della sintassi

TextEdit { 
    id: captionTextEdit 
    width: wrapperFlick.width 
    height: wrapperFlick.height 
    text: display 
    readOnly: true 

    Component.onCompleted: { 
     itemsModel.initHighlighter(index, captionTextEdit.textDocument) 
    } 

    Connections { 
     target: itemsModel 
     onUpdateTextEdit: { 
      console.log("Update element at index: " + indexToUpdate) 

      if (indexToUpdate == index) 
      { 
       console.log("Update me!") 
       captionTextEdit.append("") 
      } 
     } 
    } 

    onCursorRectangleChanged: wrapperFlick.ensureVisible(cursorRectangle) 
} 

dove updateTextEdit(indexToUpdate) è un nuovo segnale tua itemsModel deve emettere.

itemsmodel.h

signals: 
    void updateTextEdit(int indexToUpdate); 

itemsmodel.cpp

void ItemsModel::initHighlighter(int index, QQuickTextDocument *document) { 
    // Signal mapper could be avoided if lamda slot are available (Qt5 and C++11) 
    QSignalMapper* signalMapper = new QSignalMapper(this); 

    if (0 <= index && index < m_ItemsList.length()) { 
     SingleItem *item = m_ItemsList.at(index); 
     SpellCheckHighlighter *highlighter = new SpellCheckHighlighter(document->textDocument(), item); 
     QObject::connect(item, SIGNAL(spellCheckResultsReady()), 
         highlighter, SLOT(rehighlight())); 

     // TODO: Don't connect this slot for Qt 5.5+ to avoid performance overhead 
     QObject::connect(item, SIGNAL(spellCheckResultsReady()), 
         signalMapper, SLOT(map())); 
     signalMapper->setMapping(item, index); 
    } 

    connect(signalMapper, SIGNAL(mapped(int)), 
      this, SIGNAL(updateTextEdit(int))); 
} 

codice completo è disponibile qui: https://bitbucket.org/swarta/rehighlighdemo/branch/workaround#diff

+0

Ciao Simon. Finisco con la stessa soluzione. Semplicemente non usando 'append (" ")', ma usando il metodo 'deselect()' invece. In realtà, sto usando Qt 5.5.1 e nella mia complicata app questo non funziona ancora (richiede un workaround) mentre per la demo funziona in 5.5.1. Ad ogni modo, ancora non mi sono preoccupato di rispondere a questa domanda con il mio approccio, quindi accetterò la tua risposta. – Ribtoks

+0

Ok, va bene. Quindi abbiamo una buona soluzione per le altre persone che trovano e upvoting questo.Il tuo progetto dimostrativo offre molto valore a tutti coloro che vogliono iniziare con l'evidenziazione della sintassi in QML, quindi sarebbe bello tenerlo in vita. –

Problemi correlati