2016-08-09 17 views
-1

SublimeTextのようなマルチカーソル編集をサポートする小さなQScintillaウィジェットを作成したいと思います。私の知る限り、Scintillaは既に複数のカーソルをサポートしていますが、そこには例はありません。QScintillaによるマルチカーソル編集

QScintillaで複数のカーソルの基本を示す少しの例を投稿できますか?

+0

自分でサンプルを作成して質問に追加してみませんか?次に、実際のコード*のどの特定の部分に問題があるかを説明することができます。 – ekhumoro

+0

@ekhumoro確かに、それは良い出発点になるだろう、問題は私がQScintillaを提供していることに関連するどのメソッドがわからないということです。そうでなければ、私はこれを見つけることができるドキュメンテーションの部分は何ですか? – BPL

答えて

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呼び出しをラップする必要があります。

offsetはバイト単位で表現されているため、QScintillaのQStringによって多少隠されているテキストのエンコーディングに依存しています。一方、「行インデックス」は文字(Unicodeを使用する場合はコードポイント)で表現され、より信頼性が高くなります。

+0

ありがとうございます!この答えは、QScintillaを使用して崇高なテキスト動作をエミュレートするための非常に良い出発点です。しかし、もう一つの質問ですが、私はタブを使用するとちょっとうまくいきます。私は矢印キーを押すか、Shiftキーを押しながら単語を選択しようとすると問題が表示されます。その場合、マルチカーソルは消えます。これを回避するには? – BPL

+0

私はあなたがそれを意図して選択を変更することはできないと思います。おそらく、キーボードイベントを捕らえてSETSELECTION/ADDSELECTIONを自分で再実行することができます。それは次善のようですが、別の方法があるかどうかはわかりません。 –

+0

それはofftopicでした、私はあなたの答えを受け入れるでしょう。それはローリングするための良い出発点だから、ありがとう – BPL

関連する問題