【发布时间】:2022-01-10 01:40:09
【问题描述】:
我正在开发一个富文本编辑器,遇到了一个小问题,我用看起来像是“hack”的方法解决了这个问题。
所以我想检查所选文本或光标位置的文本是否有任何格式、粗体、斜体等,并检查执行相应工作的相应按钮,但它变得很奇怪。
如果我做类似的事情
if self.ed.fontItalic() is True:
self.italic.setChecked(True)
else:
self.italic.setChecked(False)
if self.ed.fontUnderline() is True:
self.uline.setChecked(True)
else:
self.uline.setChecked(False)
其中“self.italic”和“self.uline”是可检查的QPushButtons;
只检查光标下的格式,但不检查斜体和下划线按钮,即,如果所选文本具有机器人格式。
基本上,它会忽略选定的文本并查找光标下文本的格式。
所以我目前正在解析 html 以查看它是否具有格式;
def check_formatting(self):
if self.ed.textCursor().hasSelection():
print(self.ed.textCursor().selection().toHtml())
if "font-style:italic;" in self.ed.textCursor().selection().toHtml():
self.italic.setChecked(True)
else:
self.italic.setChecked(False)
if "text-decoration: underline;" in self.ed.textCursor().selection().toHtml():
self.uline.setChecked(True)
else:
self.uline.setChecked(False)
else:
if self.ed.fontItalic() is True:
self.italic.setChecked(True)
else:
self.italic.setChecked(False)
if self.ed.fontUnderline() is True:
self.uline.setChecked(True)
else:
self.uline.setChecked(False)
在按钮单击时格式化所选文本或光标下的文本的代码如下
def set_italic(self):
if self.italic.isChecked():
self.ed.setFontItalic(True)
if self.ed.textCursor().hasSelection():
if self.ed.fontItalic() != QTextFormat.FontItalic:
self.ed.setFontItalic(True)
else:
self.ed.setFontItalic(False)
else:
self.ed.setFontItalic(False)
所有这些几乎都按预期工作,但感觉都超级 hacky。并且通过 html 解析,显然,如果用户输入“font-style:italic;”在文本编辑中并选择输入的文本,斜体按钮被选中。
我在互联网上浏览了很多东西,但没有一个能像上面的代码那样帮助我实现。
【问题讨论】:
-
这是预期的行为:默认情况下,只有光标位置用于检查格式,这是有道理的;如果选择包含多种格式(甚至是多种字体粗细,因为除了“正常”和“粗体”之外还有其他粗细),函数应该返回什么?您可能对所选内容包含粗体/斜体/下划线文本这一事实感兴趣,但其他人可能想知道所选内容 only 是否包含粗体(或斜体或下划线)文本。你的方法也有问题,好像你选择了inside格式的文本,你根本不会得到任何格式信息。
-
假设您有一个 big 选择,其中有一个不同格式的 single 字符,按照您的方法,所有选择都将具有该格式,这将是违反直觉的。无论如何,如果那是您想要的,它仍然可以完成,但是您无论如何都不能使用 html,但是您必须使用 QTextCursor 并循环浏览选择中的所有格式(如果有)。除此之外,您的按钮逻辑过于复杂,因为格式功能和按钮切换功能都是布尔值,只需执行
self.italic.setChecked(self.ed.fontItalic())。
标签: python-3.8 qtextedit pyside6 pyqt6 qtextcursor