PyQt5 SQLite3编辑器语法高亮无法转为大写问题求助
解决PyQt5中QSyntaxHighlighter无法将SQL保留字转为大写的问题
问题原因
QSyntaxHighlighter的QTextCharFormat.setFontCapitalization(QFont.AllUppercase)仅负责视觉层面的大写显示,不会修改文档中的实际文本内容。如果该设置未生效,通常有以下原因:
- 当前使用的字体不支持大写转换属性
- 存在其他文本格式规则覆盖了该设置
- 正则匹配的文本区域未被正确应用格式
解决方案
方案1:确保显示层面的大写生效
如果仅需要保留字显示为大写(不修改原文本),可以调整以下几点:
- 更换为支持大写转换的等宽字体(如Consolas、Monaco),显式设置字体:
char_format = QTextCharFormat() char_format.setForeground(Qt.darkGreen) char_format.setFontWeight(QFont.Bold) # 显式设置支持的字体 char_format.setFont(QFont("Consolas", 10)) char_format.setFontCapitalization(QFont.AllUppercase)
- 检查是否有后续的高亮规则覆盖了当前设置,确保该规则在所有规则的最前面,或者没有其他规则匹配同一文本区域。
方案2:修改实际文本为大写
如果需要将文档中的保留字实际转为大写(而非仅显示),QSyntaxHighlighter无法完成这个任务,需要通过文本编辑事件处理:
- 监听
QPlainTextEdit的textChanged信号,批量替换保留字为大写:
import re # 在主窗口初始化中添加信号连接 self.sql_box.textChanged.connect(self.convert_sql_keywords_to_uppercase) def convert_sql_keywords_to_uppercase(self): # 避免递归触发textChanged self.sql_box.blockSignals(True) cursor = self.sql_box.textCursor() current_pos = cursor.position() # 全选文档内容 cursor.select(QTextCursor.Document) text = cursor.selectedText() # 遍历所有SQL保留字,不区分大小写替换为大写(添加单词边界避免误替换) for cmd in COMMANDS: pattern = re.compile(r"\b" + re.escape(cmd) + r"\b", re.IGNORECASE) text = pattern.sub(cmd.upper(), text) # 替换文本并恢复光标位置 cursor.insertText(text) cursor.setPosition(current_pos) self.sql_box.setTextCursor(cursor) self.sql_box.blockSignals(False)
- 优化体验:如果批量替换影响输入流畅度,可以改为监听
keyReleaseEvent,在用户输入完成一个单词后触发转换。
注意事项
- 方案1的视觉转换不会改变文本内容,适合仅需要高亮显示的场景;方案2会修改实际文本,适合需要标准化SQL语句的场景。
- 使用正则替换时,添加
\b单词边界,避免误替换包含保留字的其他单词(如SELECT不会替换SELECTED中的SELECT)。
内容的提问来源于stack exchange,提问作者MigueP
相关产品推荐
相关产品推荐

