<< QT && C++ トップ

ブロック単位でテキスト選択する方法

QPlainTextEditなどのエディタークラスはテキストをQTextBlockというクラスを使ってブロック単位で管理しています。

ブロックは改行ごとに分けられているのでブロックの先頭から終わりまでを選択することで1行ごとに選択できます。

例えばQPlainTextEditを継承したクラスで渡されたブロックを選択する関数を作ります。

void MyEditor::selectBlock(const QTextBlock & block){
    //ブロックが無効なら何もしない
    if(!block.isValid())
        return;
    
    QTextCursor cursor(block);
    cursor.setPosition(block.position());
        //選択位置の初めにカーソルを持ってくる
    
    //選択位置の終わりまでカーソルを移動させる。
    if(block.position() != document()->lastBlock().position())
        cursor.setPosition(block.position() + block.length());
    else
        cursor.setPosition(block.position() + block.length() - 1, QTextCursor::KeepAnchor);
    
    setTextCursor(cursor);
}

QTextCursorsetPosition関数をブロックの初めの位置から終わりの位置までを選択しています。

ただし、エディターの中での最後のブロックとそれ以外のブロックで処理を分けています。なぜこうしているかというと改行だけの行がある場合に改行も選択するためです。

この例のようにエディター内でカーソルに何か処理をさせたい場合はいったんQTextCursorインスタンスを作ってからsetTextCursorにそのカーソルを渡します。

ただカーソルに位置を指定しても何も起こらないので注意が必要です。

関連項目
プライバシーポリシー