2012/09/25(火) [n年前の日記]
#1 [python] QTextEdit上で文字列挿入
PyQt勉強中なわけだけど、
_QTextEdit
で文字列挿入などの処理をしたいなと。
コピー、カット、貼り付け、全選択は、.copy()、.cut()、.paste()、.selectAll() があるので問題無し。.clear() で全削除もできるけど、これを使うと「元に戻す」= .undo() の履歴も全て消えるので注意。
現在のカーソル位置に文字列を挿入したいだけなら、.insertPlainText("文字列") を使えばいい。
カーソル位置を少し変更したいなら、.moveCursor() が使える。引数に、 _QTextCursor.MoveOperation を渡せば、行頭移動、行末移動等、カーソル位置を変えられる。.moveCursor(QtGui.QTextCursor.StartOfLine) なら行頭に移動、みたいな。
選択範囲がある場合の手順がよく分からず。どうやら、.textCursor() を呼ぶことで _QTextCursor を取得して、それを使ってどうにかする、のかな?
以下は、QTextCursor を使ってできること。
スクリプト側から選択範囲を作れたら、もう少し色々できるのかもしれんけど。まだそこまで分かってない。英語はちんぷんかんぷんなので。
一応、ソースコードの断片をメモ。
コピー、カット、貼り付け、全選択は、.copy()、.cut()、.paste()、.selectAll() があるので問題無し。.clear() で全削除もできるけど、これを使うと「元に戻す」= .undo() の履歴も全て消えるので注意。
現在のカーソル位置に文字列を挿入したいだけなら、.insertPlainText("文字列") を使えばいい。
カーソル位置を少し変更したいなら、.moveCursor() が使える。引数に、 _QTextCursor.MoveOperation を渡せば、行頭移動、行末移動等、カーソル位置を変えられる。.moveCursor(QtGui.QTextCursor.StartOfLine) なら行頭に移動、みたいな。
選択範囲がある場合の手順がよく分からず。どうやら、.textCursor() を呼ぶことで _QTextCursor を取得して、それを使ってどうにかする、のかな?
以下は、QTextCursor を使ってできること。
- 選択範囲があるかどうかを調べたい。 → .hasSelection()
- 選択範囲の文字列を取得したい。 → .selectedText()
- 選択範囲がある状態で、選択範囲の文字列を消去したい。 → .deleteChar() を呼ぶ。.removeSelectedText() てのもあるみたいだけど…?
- 選択範囲なんてものは無かったことにしたい。 → .clearSelection()
- なんやかんや加工した文字列を挿入したい。 → .insertText("文字列")
- カーソル移動したい。 → .movePosition()
- 処理後のカーソル位置を QTextEdit に反映させたい。 → QTextEdit の .setTextCursor() を、今まで処理に使ってた QTextCursor を渡して呼ぶ。それをしないと、処理前のカーソル位置のままになる。
- .undo() の履歴を制御したい。 → .beginEditBlock()、.endEditBlock() で処理を挟む、のかな? ここはちょっとよく分からない。
スクリプト側から選択範囲を作れたら、もう少し色々できるのかもしれんけど。まだそこまで分かってない。英語はちんぷんかんぷんなので。
一応、ソースコードの断片をメモ。
def ins_put(self, mark): """行中で単語をmarkdown用記号で挟み込む""" cursor = self.ui.editor_window.textCursor() if cursor.hasSelection(): # 選択範囲有り selstr = cursor.selectedText() # 選択範囲の文字列を取得 cursor.beginEditBlock() cursor.deleteChar() # 選択範囲を削除 cursor.insertText(mark + selstr + mark) # 文字列挿入 self.ui.editor_window.setTextCursor(cursor) # カーソル位置を反映 cursor.endEditBlock() else: # 選択範囲無し self.ui.editor_window.insertPlainText(mark + "Text" + mark)editor_window てのは、QTextEdit の objectName。
[ ツッコむ ]
以上です。