2015-11-29 3 views
8

TL; DR:TextEditは、強調表示されたテキストをクリックするとペイントされます。何も役に立たないTextEditで強調表示ができない

ListViewには、文字列プロパティのQAbstractListModelモデルがあります。 これらの文字列プロパティはスペルチェックされており、QSyntaxHighlighterはスペルエラーを表示するために使用されます。 QSyntaxHighlighter子孫をComponent.onCompletedに作成します。TextEditです。正しい綴りエラーでハイライトされたgetが実行されたことを再度確認し、蛍光灯のsetFormat()が正しい位置で実行されました。問題は、TextEditをクリックした場合にのみ、テキストを赤く(無効に)描画することです。 Flickable(追跡するカーソル)で

TextEdit生活やでFlickable生活Rectangle(素敵な背景と境界を持っています)。いくつかの信号にバインドして、TextEditというupdate()を呼び出すことは役に立ちません。

スペルチェックが完了した後、私はrehighlight()のSyntaxHighlighterの信号を出します。テキストに私はこの問題を解決する方法をhttps://bitbucket.org/ribtoks/rehighlighdemo/src

任意のアイデアをクリックするまで、ここで

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

は、それが動作しないかのデモンストレーションでプロジェクトの小さなサンプルですか?

+1

は私が構築し、あなたのソースを実行するが、プログラムは、あなたが期待通りに動作します。スペルチェックボタンをクリックすると、単語が強調表示されます。私はOSXでQt 5.5.1を使用しました – DenimPowell

+0

すべてが期待どおりに動作しますが、make disclean && qmake &&で ' – swex

+0

'を使ってプロジェクトを再構築してみてください。清掃および清掃の有無にかかわらず。 5.5.1で動作している可能性があります。しかし私はQt 5.2まで私の製品に互換性を持たせる必要があります。これはハックを必要とするだけでなく、5.4 – Ribtoks

答えて

0

この問題はおそらくQt 5.5で修正されたQTBUG-44765によって引き起こされました。

バグのレベルが低いと、私はそれが実際にその問題を回避するとは考えていません。

あなたは、あなたがupdateTextEdit(indexToUpdate)があなたのitemsModelを発するようにされた新しい信号である

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

を強調構文で行われているときにテキストエディットに空の文字列を追加していることを回避することができます。

itemsmodel.cpp

signals: 
    void updateTextEdit(int indexToUpdate); 

itemsmodel.h

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

完全なコードはここにあります:https://bitbucket.org/swarta/rehighlighdemo/branch/workaround#diff

+0

こんにちはSimonです。私は同じ回避策で終わります。 'append(" ")'を使わず、代わりに 'deselect()'メソッドを使うだけです。実際にはQt 5.5.1を使用していますが、私の複雑なアプリケーションではまだ動作しません(回避策が必要です)。デモの場合は5.5.1で動作します。とにかく、私はまだ私のアプローチでこの質問に答えることに気にしなかったので、私はあなたの答えを受け入れるでしょう。 – Ribtoks

+0

よかった。だから私たちはこれを見つけてアップボーニングする他の人々のための良い解決策を持っています。あなたのデモプロジェクトは、QMLで構文の強調表示を開始したいすべての人に多大な価値を提供します。したがって、それを生かし続けるのがよいでしょう。 –

関連する問題