【问题标题】:Multi-Cursor editing with QScintilla使用 QScintilla 进行多光标编辑
【发布时间】:2016-12-15 11:20:21
【问题描述】:

我想创建一个小的 QScintilla 小部件,支持像 SublimeText 中的多光标编辑。据我所知,Scintilla 已经支持多个游标,但我还没有看到任何示例。

那么,任何人都可以发布一个小例子,展示使用 QScintilla 的多个光标的基础知识吗?

【问题讨论】:

  • 为什么不尝试自己创建一个示例,并将其添加到您的问题中?然后,您可以解释您遇到困难的实际代码的哪些特定部分。
  • @ekhumoro 当然,这将是一个很好的起点,问题是我不知道与我所要求的相关的方法是提供 QScintilla。否则,我可以在文档的哪个部分找到这个?

标签: python pyqt pyqt5 qscintilla


【解决方案1】:

多光标功能在 Scintilla 中可用,但 QScintilla 不提供此功能的直接包装器。但是,您可以“重新实现”您的包装器,因为几乎所有事情都可以使用 SendScintilla 方法完成。

from PyQt5.Qsci import QsciScintilla
from PyQt5.QtWidgets import QApplication

app = QApplication([])

ed = QsciScintilla()

ed.setText('insert <-\nsome <-\ntext <-\n')
ed.show()

# typing should insert in all selections at the same time
ed.SendScintilla(ed.SCI_SETADDITIONALSELECTIONTYPING, 1)

# do multiple selections
offset = ed.positionFromLineIndex(0, 7) # line-index to offset
ed.SendScintilla(ed.SCI_SETSELECTION, offset, offset)
# using the same offset twice selects no characters, hence a cursor

offset = ed.positionFromLineIndex(1, 5)
ed.SendScintilla(ed.SCI_ADDSELECTION, offset, offset)

offset = ed.positionFromLineIndex(2, 5)
ed.SendScintilla(ed.SCI_ADDSELECTION, offset, offset)

app.exec_()

您应该将 SendScintilla 调用包装在您自己的包装器中。

请记住,offsets 以字节表示,因此取决于文本的编码,这或多或少被 QScintilla 的 QStrings 隐藏。另一方面,“行索引”以字符表示(如果使用 unicode,则为代码点),因此更可靠。

【讨论】:

  • 非常感谢!这个答案是一个很好的起点,可以开始使用 QScintilla 模拟崇高的文本行为。不过,还有一个问题,当我使用标签时,它还可以。当我按箭头键或尝试使用 shift 选择单词时出现问题,在这种情况下,多光标消失。有什么解决方法吗?
  • 我认为不可能按照您的意愿更改选择。也许您可以捕获键盘事件并自己重新执行 SETSELECTION/ADDSELECTION。这似乎不是最理想的,但我不确定还有其他方法。
  • 好的,那是题外话,我会接受你的回答,因为这是一个很好的起点,谢谢
猜你喜欢
  • 2012-11-01
  • 2015-10-08
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多