2013-04-04 4 views
2

Я могу получить строку курсора, используя QTextEdit.textCursor().blockNumber(), но когда одна строка обертывается в несколько строк, она не может вернуть номер фактической строки.Как получить номер строки действительного видимого курсора

Как я могу это сделать?

+0

искривленных линий, как правило, рассматривают как одну линию, все мои редакторы работает так: Notpad ++, VI, .... –

+0

Конечно, я использую Vim. Но мне нужно всплывать окно под «фактической» строкой «TextEdit», поэтому я должен это сделать ... –

ответ

3

Я не был уверен, что он будет работать, так что я написал быстрый тестовое приложение (Qt 5.0.1) и это работает, вот часть этого:

void MainWindow::on_plainTextEdit_cursorPositionChanged() 
{ 
    QPlainTextEdit *edit = qobject_cast<QPlainTextEdit *>(sender()); 
    Q_ASSERT(edit); 
    QTextCursor cursor = edit->textCursor(); 
    cursor.movePosition(QTextCursor::StartOfLine); 

    int lines = 1; 
    while(cursor.positionInBlock()>0) { 
     cursor.movePosition(QTextCursor::Up); 
     lines++; 
    } 
    QTextBlock block = cursor.block().previous(); 

    while(block.isValid()) { 
     lines += block.lineCount(); 
     block = block.previous(); 
    } 
    ui->label->setText(QString::number(lines)); 
} 
+0

Удивительное решение! Я просто переводил его в Python, и это работает! Я заполняю некоторые 'a' в TextEdit, чтобы угадать длину текста на каждой строке раньше. Это очень противно. –

+0

Первый цикл while для меня не работает b/c, он подсчитывает завернутые строки. Будет опубликовано другое решение ниже. – Wingware

+0

@Wingware да, он считается завернутыми линиями, так как он был запрошен в вопросе (см. Комментарии под вопросом). Если вы не хотите, чтобы строки с округленными графами были округлены, просто подсчитайте блоки (код проще). –

-1

QTextCursor имеет много полезных методов, как:

int QTextCursor::position() const 

Возвращает абсолютную позицию курсора в документе. Курсор расположен между символами.

и

INT QTextCursor :: positionInBlock() Const

Возвращает относительную позицию курсора в пределах блока. Курсор расположен между символами.

Это эквивалентно position() - block().position().

+0

'position()' возвращает длину символов. Мне нужен видимый номер строки ... –

1

Вот аналогичное решение в Python , Он исправляет проблему, отмеченную мной в комментарии к предыдущему выше. Это метод в подклассе QTextEdit:

def getLineAtPosition(self, pos): 
    cursor = self.textCursor() 
    cursor.setPosition(pos) 

    cursor.movePosition(QTextCursor.StartOfLine) 
    lines = 0 

    lines_text = cursor.block().text().splitlines() 
    lines_pos = 0 
    for line_text in lines_text: 
    lines_pos += len(line_text) + 1 
    if lines_pos > cursor.position() - cursor.block().position(): 
     break 
    lines += 1 

    block = cursor.block().previous() 
    while block.isValid(): 
    lines += block.lineCount() 
    block = block.previous() 

    return lines 
+0

Это считается физическими линиями, а не завернутыми линиями, которые, по-видимому, нужны OP (извините, мое замешательство). Еще может быть полезно, если оставить его здесь. Обратите внимание, что это работает, если вы устанавливаетеHtml() w/text, который имеет
, производящие линии. Однако, видимо, в этом случае есть только один блок. – Wingware