2015-11-29 6 views
8

TL; DR: TextEdit malt hervorgehobenen Text nur, wenn ich darauf klicke. Nichts hilftDie Hervorhebung von TextEdit funktioniert nicht

Ich habe eine ListView mit einem QAbstractListModel Modell mit String-Eigenschaften. Diese Zeichenfolgeneigenschaften werden geprüft, und QSyntaxHighlighter wird verwendet, um Rechtschreibfehler anzuzeigen. Ich erstelle QSyntaxHighlighter Nachkommen in Component.onCompleted von TextEdit. Ich habe die Hervorhebung mit korrekten Rechtschreibfehlern überprüft und setFormat() von Highlighter mit korrekten Positionen ausgeführt. Das Problem ist, dass es Text in rot (ungültig) zeichnet, nur wenn ich auf die TextEdit selbst klicke.

TextEdit Leben in einer Flickable (Cursor zu verfolgen) und Flickable Leben in einem Rectangle (schönen Hintergrund und Grenze zu haben). Die Bindung an einige Signale und das Aufrufen von update() von TextEdit hilft nicht.

Nachdem die Rechtschreibprüfung abgeschlossen ist, gebe ich das Signal rehighlight() des erstellten SyntaxHighlighter aus.

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

Hier ist eine kleine Auswahl von Projekt mit Demonstration, wie es bis auf einen Text https://bitbucket.org/ribtoks/rehighlighdemo/src

Irgendwelche Ideen nicht funktioniert klicken, wie ich dieses Problem lösen kann?

+1

I gebaut und Ihre Quelle ausgeführt, sondern das Programm funktioniert wie erwartet. Die Wörter werden markiert, nachdem ich die Rechtschreibprüfung angeklickt habe. Ich benutzte Qt 5.5.1 auf OSX – DenimPowell

+0

Alles funktioniert wie Sie es erwartet, versuchen Sie, Projekt mit make disclean && qmake & & make make ' – swex

+0

Es funktioniert nicht für Qt 5.4 sicher. Mit oder ohne Reinigung und qmaking. Es kann an 5.5.1 arbeiten. Aber ich muss eine Kompatibilität in meinem Produkt bis zu Qt 5.2 behalten, die etwas Hack sowie 5.4 – Ribtoks

Antwort

0

Das Problem wurde wahrscheinlich von QTBUG-44765 verursacht, in Qt 5.5 behoben.

Angesichts der niedrigen Ebene des Bugs, ich glaube nicht, dass es praktisch um es zu arbeiten.

Sie arbeiten um, dass eine leere Zeichenfolge an den TextEdit durch Anhängen, wenn Sie mit der Syntax

Hervorhebung gemacht
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) 
} 

wo updateTextEdit(indexToUpdate) ein neues Signal Ihre itemsModel ist, hat zu emittieren.

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

Voll Code ist hier verfügbar: https://bitbucket.org/swarta/rehighlighdemo/branch/workaround#diff

+0

Hi Simon benötigen würde. Ich habe die gleiche Problemumgehung. Verwenden Sie einfach nicht 'append (" ")', sondern stattdessen die Methode 'deselect()'. Eigentlich benutze ich Qt 5.5.1 und in meiner komplizierten App funktioniert das immer noch nicht (benötigt eine Workaround), während es für Demo 5.5.1 funktioniert. Wie auch immer, ich habe mich immer noch nicht darum gekümmert, diese Frage mit meinem Ansatz zu beantworten, also werde ich deine Antwort akzeptieren. – Ribtoks

+0

Okay, cool. Wir haben also eine gute Lösung für andere Leute, die das finden und verbessern.Ihr Demoprojekt bietet viel Wert für alle, die mit der Syntaxhervorhebung in QML beginnen wollen, also wäre es schön, sie am Leben zu erhalten. –