利用光标获取QTextEdit的行号

connect(pTextEdit, SIGNAL(cursorPositionChanged()), this, SLOT(on_textEdit_cursorPositionChanged()));
void XXX::on_textEdit_cursorPositionChanged()
{
  //当前光标
  QTextCursor tc = pTextEdit->textCursor(); 
  QTextLayout *pLayout = tc.block().layout();
  //当前光标在本BLOCK内的相对位置
  int nCurpos = tc.position() - tc.block().position();
  int nTextline = pLayout->lineForTextPosition(nCurpos).lineNumber() + tc.block().firstLineNumber();
  qDebug()<<nTextline<<endl;           //可以看到行号随着光标的改变而改变
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在QTextEdit中显示行号,可以通过以下步骤实现: 1. 创建一个新的QWidget,用于包含QTextEdit和显示行号的QLabel。 2. 将QTextEdit的verticalScrollBar()的valueChanged信连接到一个槽函数,该槽函数将更新QLabel中的行号。 3. 在QTextEdit的paintEvent中绘制行号。 以下是示例代码: ```python from PyQt5.QtWidgets import QWidget, QTextEdit, QVBoxLayout, QLabel class LineNumberArea(QWidget): def __init__(self, editor): super().__init__() self.editor = editor def sizeHint(self): return self.editor.sizeHint() def paintEvent(self, event): painter = QPainter(self) font_metrics = self.editor.fontMetrics() block = self.editor.firstVisibleBlock() line_number = block.blockNumber() top = self.editor.blockBoundingGeometry(block).translated(self.editor.contentOffset()).top() bottom = top + self.editor.blockBoundingRect(block).height() # Iterate over visible blocks while block.isValid() and top <= event.rect().bottom(): if block.isVisible() and bottom >= event.rect().top(): # Draw line number number_width = font_metrics.width(str(line_number)) number_rect = QRect(0, top, self.width() - 5, font_metrics.height()) painter.drawText(number_rect, Qt.AlignRight, str(line_number)) block = block.next() top = bottom bottom = top + self.editor.blockBoundingRect(block).height() line_number += 1 class TextEditor(QWidget): def __init__(self): super().__init__() self.text_edit = QTextEdit(self) self.line_number_area = LineNumberArea(self.text_edit) self.init_ui() def init_ui(self): layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.text_edit) self.setLayout(layout) # Connect signal to update line number area self.text_edit.verticalScrollBar().valueChanged.connect(self.update_line_number_area) def update_line_number_area(self): rect = self.line_number_area.rect().intersected(self.text_edit.viewport().rect()) self.line_number_area.update(0, rect.y(), self.line_number_area.width(), rect.height()) def resizeEvent(self, event): super().resizeEvent(event) self.line_number_area.setGeometry(QRect(self.contentsRect().left(), self.contentsRect().top(), self.line_number_area.width(), self.height())) self.text_edit.setGeometry(QRect(self.line_number_area.width(), self.contentsRect().top(), self.contentsRect().right() - self.line_number_area.width(), self.height())) def paintEvent(self, event): super().paintEvent(event) painter = QPainter(self) painter.fillRect(self.line_number_area.rect(), Qt.lightGray) ``` 在这个示例中,我们创建了一个名为LineNumberArea的新QWidget,它使用QPainter在QTextEdit旁边显示行号。在TextEditor中,我们将QTextEdit和LineNumberArea组合在一起,并将QTextEdit的verticalScrollBar()的valueChanged信连接到一个槽函数,该槽函数将更新LineNumberArea中的行号。我们还实现了resizeEvent和paintEvent函数来确保LineNumberArea与QTextEdit正确地对齐,并在文本编辑器旁边绘制一个灰色背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值