You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复PySide6代码编辑器行号计数异常与状态栏显示问题

问题解决方案

1. 行号计数器异常修复

问题原因:原代码仅统计硬换行产生的文本块数量,无法识别自动换行的软换行,导致输入字符超出一行自动换行时,行号不更新。

修复方案:

  • 使用QTextEdit.lineCount()获取包含软换行的实际显示总行数,替代原有的基于光标块的统计逻辑
  • 新增监听窗口大小变化的resizeEvent,确保窗口缩放时行号同步更新

修改后的关键代码:

def update_line_numbers(self):
    # 获取包含自动换行的总行数
    total_lines = self.txt.lineCount()
    # 生成连续行号文本
    line_num_text = '\n'.join(str(line) for line in range(1, total_lines + 1))
    self.line_numbers.setText(line_num_text)

def resizeEvent(self, event):
    super().resizeEvent(event)
    self.update_line_numbers()

2. 状态栏白色竖线修复

问题原因:QStatusBar中添加的部件默认带有分隔边框,加上从右到左的布局设置,导致右侧出现白色竖线。

修复方案:

  • 在状态栏样式表中添加QStatusBar::item { border: none; },移除部件默认边框
  • 若不需要从右到左布局,可删除self.statusbar.setLayoutDirection(Qt.RightToLeft),让文本默认靠左显示

修改后的状态栏样式代码:

self.statusbar.setStyleSheet('''
    QStatusBar {
        background-color: black;
    }
    QStatusBar::item {
        border: none;
    }
''')
完整修改后的代码
import sys
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *

class TextEditor(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("e-dit")
        self.setGeometry(850, 780, 190, 190)
        # Set the main window and tab title bar background color
        style_sheet = """
            QMainWindow {
                background-color: black;
            }
        """ 
        self.setStyleSheet(style_sheet)
        
        self.label = QLabel()
        self.label.setText('Ready')
        self.label.setStyleSheet('color: green; border: none;')
        
        # create a status bar and add the label to it
        self.statusbar = self.statusBar()
        # 移除从右到左布局,让文本默认靠左显示(可选,根据需求调整)
        # self.statusbar.setLayoutDirection(Qt.RightToLeft)
        self.statusbar.setStyleSheet('''
            QStatusBar {
                background-color: black;
            }
            QStatusBar::item {
                border: none;
            }
        ''')

        self.statusbar.addWidget(self.label)
        # create a text edit       
        self.txt = QTextEdit(self)
        self.txt.setStyleSheet("background-color: #000; color: green; font-family: Hack; font-size: 14px; border: none;")
        self.txt.setAlignment(Qt.AlignmentFlag.AlignRight)
        self.txt.textChanged.connect(self.update_line_numbers)

        # create the label widget for line numbers
        self.line_numbers = QLabel(self)
        self.line_numbers.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignRight)
        self.line_numbers.setStyleSheet("background-color: #000; color: green; font-family: Hack; font-size: 14px; border: none;")

        # create the main layout
        main_layout = QHBoxLayout()
        main_layout.setContentsMargins(0, 0, 0, 0)
        main_layout.addWidget(self.line_numbers)
        main_layout.addWidget(self.txt)
        
        # create the main widget
        lyn0 = QWidget()
        lyn0.setLayout(main_layout)

        # set the central widget of the main window
        self.setCentralWidget(lyn0)

    def update_line_numbers(self):
        # 获取包含自动换行的总行数
        total_lines = self.txt.lineCount()
        # 生成连续行号文本
        line_num_text = '\n'.join(str(line) for line in range(1, total_lines + 1))
        self.line_numbers.setText(line_num_text)

    def resizeEvent(self, event):
        super().resizeEvent(event)
        self.update_line_numbers()

    def mousePressEvent(self, event):
        if event.button() == Qt.MouseButton.LeftButton:
            self._move()
        super().mousePressEvent(event)

    def _move(self):
        window = self.window().windowHandle()
        window.startSystemMove()
        
if __name__ == '__main__':
    app = QApplication([])
    editor = TextEditor()
    editor.show()
    app.exec()

内容的提问来源于stack exchange,提问作者warsame farah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:07:04