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;

升级版:

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

将位置设置为选择的开始。获取当前块,获取块布局并使用 Qt API 获取行号。我不知道返回的行号对于整个文档或布局是绝对的。如果仅用于布局,则需要一些额外的过程来计算先前块的行号。

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