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

PyQt5 SQLite3编辑器语法高亮无法转为大写问题求助

解决PyQt5中QSyntaxHighlighter无法将SQL保留字转为大写的问题

问题原因

QSyntaxHighlighter的QTextCharFormat.setFontCapitalization(QFont.AllUppercase)仅负责视觉层面的大写显示,不会修改文档中的实际文本内容。如果该设置未生效,通常有以下原因:

  • 当前使用的字体不支持大写转换属性
  • 存在其他文本格式规则覆盖了该设置
  • 正则匹配的文本区域未被正确应用格式

解决方案

方案1:确保显示层面的大写生效

如果仅需要保留字显示为大写(不修改原文本),可以调整以下几点:

  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)
  1. 检查是否有后续的高亮规则覆盖了当前设置,确保该规则在所有规则的最前面,或者没有其他规则匹配同一文本区域。

方案2:修改实际文本为大写

如果需要将文档中的保留字实际转为大写(而非仅显示),QSyntaxHighlighter无法完成这个任务,需要通过文本编辑事件处理:

  1. 监听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)
  1. 优化体验:如果批量替换影响输入流畅度,可以改为监听keyReleaseEvent,在用户输入完成一个单词后触发转换。

注意事项

  • 方案1的视觉转换不会改变文本内容,适合仅需要高亮显示的场景;方案2会修改实际文本,适合需要标准化SQL语句的场景。
  • 使用正则替换时,添加\b单词边界,避免误替换包含保留字的其他单词(如SELECT不会替换SELECTED中的SELECT)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:09:53