5

ユーザーがテキスト行を選択したことを検出するために、次のコード(mouseReleaseEventに実装されています)があります。

    QTextCursor cursor = this->textCursor();
    int start = cursor.selectionStart();
    int end = cursor.selectionEnd();

    if(!cursor.hasSelection())
        return; // No selection available

    qWarning() << "start: " << start << " end: " << end << endl;

問題は次のとおりです。選択が開始および終了する行番号が必要です。私はブロックに苦労して何も解決していませんが、手がかりを教えていただけますか?

4

2 に答える 2

6

それが最善の解決策ではない可能性はありますが、私にとってはうまくいくようです。変数selectedLinesには、選択された行数が含まれます。

QTextCursor cursor = ui->plainTextEdit->textCursor();
int selectedLines = 0; //<--- this is it 
if(!cursor.selection().isEmpty())
{
    QString str = cursor.selection().toPlainText();
    selectedLines = str.count("\n")+1;
}

お役に立てば幸いです:)

于 2012-07-28T13:06:08.517 に答える
1

2つのQTextCursorメソッドのチェーン(setPositionとblockNumber)を使用する簡単な方法がわかります。

QTextCursor cursor = this->textCursor();
int start = cursor.selectionStart();
int end = cursor.selectionEnd();

if(!cursor.hasSelection())
    return; // No selection available

cursor.setPosition(start);
int firstLine = cursor.blockNumber();
cursor.setPosition(end, QTextCursor::KeepAnchor);
int lastLine = cursor.blockNumber();
qWarning() << "start: " << firstLine << " end: " << lastLine << endl;

UPD:

 cursor.setPosition(start);
 cursor.block().layout()->lineForTextPosition(start).lineNumber();
 // or
 cursor.block().layout()->lineAt(<relative pos from start of block>).lineNumber();

選択を開始する位置を設定します。現在のブロックを取得し、ブロックのレイアウトを取得し、QtAPIを使用して行番号を取得します。返される行番号がドキュメント全体またはレイアウトの絶対値であるかどうかはわかりません。レイアウトのみの場合は、前のブロックの行番号を計算するための追加のプロセスが必要です。

for (QTextBlock block = cursor.block(). previous(); block.isValid(); block = block.previous())
    lines += block.lineCount();
于 2012-07-26T20:57:55.990 に答える