简体   繁体   中英

How to get text next to cursor in QTextEdit in PyQt4

I am making a light IDE for bash scripts, and i want an option, when i press Ctrl + / >> one line, where my 'textCursor' is, will be commented, and i have managed to do that, but i also want to uncomment line with the same command. But i cannot get text next to 'textCursor'.

def commentShortcut(self):
    cursor = self.textCursor()
    Y = cursor.blockNumber()
    self.moveCursor(QtGui.QTextCursor.End)
    cursor = QtGui.QTextCursor(self.document().findBlockByLineNumber(Y))
    self.setTextCursor(cursor)
    self.insertPlainText("#")

This part of the code moves my textCursor to the start of that line where I insert '#' (comment sign) with self.insertPlainText() function.

note: class is inheriting QTextEdit and that's why i am using it only with self .

To sum up, i just need an method to check character next to textCursor and if that character is '#' i will remove it, and if it is not, then i will insert new '#' any help would be appretiated.

You must move to the beginning of the line, then skip the blank spaces, select the first character and compare it, then for the removal process you must remove the "#" and the blank spaces to the right, and for the insertion it is recommended to insert "# "

Ps : I could not try the Shortcut Ctrl + / for what I use: Ctrl + R

import sys
from PyQt4 import QtCore, QtGui

class TextEdit(QtGui.QTextEdit):
    def __init__(self, *args, **kwargs):
        QtGui.QWidget.__init__(self, *args, **kwargs)
        shortcut = QtGui.QShortcut(QtGui.QKeySequence("Ctrl+R"), self)
        shortcut.activated.connect(self.commentShortcut)

    def commentShortcut(self):
        pos = self.textCursor().position()
        self.moveCursor(QtGui.QTextCursor.StartOfLine)
        line_text = self.textCursor().block().text()
        if self.textCursor().block().text().startswith(" "):
            # skip the white space
            self.moveCursor(QtGui.QTextCursor.NextWord)
        self.moveCursor(QtGui.QTextCursor.NextCharacter,QtGui.QTextCursor.KeepAnchor)
        character = self.textCursor().selectedText()
        if character == "#":
            # delete #
            self.textCursor().deletePreviousChar()
            # delete white space 
            self.moveCursor(QtGui.QTextCursor.NextWord,QtGui.QTextCursor.KeepAnchor)
            self.textCursor().removeSelectedText()
        else:
            self.moveCursor(QtGui.QTextCursor.PreviousCharacter,QtGui.QTextCursor.KeepAnchor)
            self.textCursor().insertText("# ")
        cursor = QtGui.QTextCursor(self.textCursor())
        cursor.setPosition(pos)
        self.setTextCursor(cursor)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    w = TextEdit()
    w.append('''

#!/bin/bash
# Simple line count example, using bash
#
# Bash tutorial: http://linuxconfig.org/Bash_scripting_Tutorial#8-2-read-file-into-bash-array
# My scripting link: http://www.macs.hw.ac.uk/~hwloidl/docs/index.html#scripting
#
# Usage: ./line_count.sh file
# -----------------------------------------------------------------------------

# Link filedescriptor 10 with stdin
exec 10<&0
# stdin replaced with a file supplied as a first argument
exec < $1
# remember the name of the input file
in=$1

# init
file="current_line.txt"
let count=0

# this while loop iterates over all lines of the file
while read LINE
do
    # increase line counter 
    ((count++))
    # write current line to a tmp file with name $file (not needed for counting)
    echo $LINE > $file
    # this checks the return code of echo (not needed for writing; just for demo)
    if [ $? -ne 0 ] 
     then echo "Error in writing to file ${file}; check its permissions!"
    fi
done

echo "Number of lines: $count"
echo "The last line of the file is: `cat ${file}`"

# Note: You can achieve the same by just using the tool wc like this
echo "Expected number of lines: `wc -l $in`"

# restore stdin from filedescriptor 10
# and close filedescriptor 10
exec 0<&10 10<&-
        ''')
    w.show()
    sys.exit(app.exec_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM