6

私が書いているエディターで簡単なテキスト検索を実装しようとしています。この問題が発生するまで、すべて問題ありませんでした。ここで後方検索を実装しようとしています。手順は次のとおりです。件名が見つからない場合は後方を探し、ビープ音を1回鳴らし、検索ボタンをもう一度押した場合は、ドキュメントの最後に移動して、もう一度検索を実行します。「reachedEnd」はintであり、editorクラスのプライベートメンバーとして定義されます。これが後方検索を行う関数です。

void TextEditor::findPrevPressed() {
    QTextDocument *document = curTextPage()->document();
    QTextCursor    cursor   = curTextPage()->textCursor();

    QString find=findInput->text(), replace=replaceInput->text();


    if (!cursor.isNull()) {
        curTextPage()->setTextCursor(cursor);
        reachedEnd = 0;
    }
    else {
        if(!reachedEnd) {
            QApplication::beep();
            reachedEnd = 1;
        }
        else {
            reachedEnd = 0;
            cursor.movePosition(QTextCursor::End);
            curTextPage()->setTextCursor(cursor);
            findPrevPressed();
        }
    }
}

問題は、カーソルが最後まで移動しないことです。そして、Falseを返します。これは失敗を意味します。どうしてこれが失敗するのでしょうか?!! 前もって感謝します。

4

2 に答える 2

8

この質問にはいくつかの見解があり、一般的な問題のように思われるので、答える価値があると思います(著者が最も確実に理解したとしても)。

ドキュメントから:

QTextCursor QPlainTextEdit :: textCursor()const
現在表示されているカーソルを表すQTextCursorのコピーを返します。返されたカーソルの変更は、QPlainTextEditのカーソルには影響しないことに注意してください。setTextCursor()を使用して、表示されているカーソルを更新します。

だからあなたはそれのコピーを手に入れました、そしてそれをすることによってそれはうまくいきcursor.movePosition(QTextCursor::End);ません。

私がしたことは:

QTextCursor newCursor = new QTextCursor(document);
newCursor.movePosition(QTextCursor::End);
curTextPage()->setTextCursor(newCursor);
于 2016-06-01T18:28:08.607 に答える
3

このようにコードを単純化すると、次のようになります。

if (!cursor.isNull()) {
   // (...)
}
else {
    // (...)
    cursor.movePosition(QTextCursor::End);
    // (...)
}

... cursor.isNull()条件が真のときにmovePosition()関数を呼び出したことがわかります。多分これはそれが機能しない理由です...

于 2011-07-22T15:47:42.273 に答える