修复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
相关产品推荐
相关产品推荐

