Search code examples
pythonpyqtpyqt4qtextedit

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.


Solution

  • 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_())