SublimeTextのようなマルチカーソル編集をサポートする小さなQScintillaウィジェットを作成したいと思います。私の知る限り、Scintillaは既に複数のカーソルをサポートしていますが、そこには例はありません。QScintillaによるマルチカーソル編集
QScintillaで複数のカーソルの基本を示す少しの例を投稿できますか?
SublimeTextのようなマルチカーソル編集をサポートする小さなQScintillaウィジェットを作成したいと思います。私の知る限り、Scintillaは既に複数のカーソルをサポートしていますが、そこには例はありません。QScintillaによるマルチカーソル編集
QScintillaで複数のカーソルの基本を示す少しの例を投稿できますか?
マルチカーソル機能は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
呼び出しをラップする必要があります。
offset
はバイト単位で表現されているため、QScintillaのQStringによって多少隠されているテキストのエンコーディングに依存しています。一方、「行インデックス」は文字(Unicodeを使用する場合はコードポイント)で表現され、より信頼性が高くなります。
ありがとうございます!この答えは、QScintillaを使用して崇高なテキスト動作をエミュレートするための非常に良い出発点です。しかし、もう一つの質問ですが、私はタブを使用するとちょっとうまくいきます。私は矢印キーを押すか、Shiftキーを押しながら単語を選択しようとすると問題が表示されます。その場合、マルチカーソルは消えます。これを回避するには? – BPL
私はあなたがそれを意図して選択を変更することはできないと思います。おそらく、キーボードイベントを捕らえてSETSELECTION/ADDSELECTIONを自分で再実行することができます。それは次善のようですが、別の方法があるかどうかはわかりません。 –
それはofftopicでした、私はあなたの答えを受け入れるでしょう。それはローリングするための良い出発点だから、ありがとう – BPL
自分でサンプルを作成して質問に追加してみませんか?次に、実際のコード*のどの特定の部分に問題があるかを説明することができます。 – ekhumoro
@ekhumoro確かに、それは良い出発点になるだろう、問題は私がQScintillaを提供していることに関連するどのメソッドがわからないということです。そうでなければ、私はこれを見つけることができるドキュメンテーションの部分は何ですか? – BPL