0

私は単純なエディターを開発しており、エディターで sth を実装しようとしています。このように:たとえば、ユーザーが「void」と入力すると、信号が送信され、GUIのどこかでそれがキャッチされ、それ自体が変更されます。コードで構文ハイライターの例を使用しており、highlightBlock 関数でシグナルを出力しました。

void Highlighter::highlightBlock(const QString &text)
 {
     foreach (const HighlightingRule &rule, highlightingRules) {
         QRegExp expression(rule.pattern);
         if (expression.exactMatch("void")==true) {
             emit voidPrinted(2);

         }
         int index = expression.indexIn(text);
         while (index >= 0) {
             int length = expression.matchedLength();
         ...
     }

しかし、プログラムを実行すると、void と入力せずに信号が常に出力されます。ドキュメンテーションには、「highlightBlock() 関数は、リッチ テキスト エンジンが必要とするとき、つまり、変更されたテキスト ブロックがあるときはいつでも自動的に呼び出される」と記載されています。表現が無効な場合にのみ放出すると思いますが、明らかに間違っています。何か助けはありますか?

4

1 に答える 1

0

ユーザーが入力したテキストではなく、文字列リテラル「void」に対して正規表現を実行していexpression.exactMatch("void")ますexpression.exactMatch(text)。まだ行っていない場合は、highlightingRules のパターンとして「void」文字列を追加する必要もあります。

また、このメソッドに「void ルール」用の特別なシグナルを追加すると、複数の処理が行われることも考慮してください。ルールは、一致時に適用されるマッチャーと指定された強調表示を含むデータとして定義されますが、一致の 1 つに対して特別な無関係な動作をハードコーディングしています。これは、あなたが間違ったことをしていることを示唆していますが、あなたが作業しているコードをさらに研究しなければ、物事をより良くする方法を教えることはできませんでした.

于 2012-10-23T00:10:09.597 に答える