Как сделать чтобы выделенный текст в QTextEdit при переходе меню оставался в фокусе(то есть не серел)

Я просто хочу чтобы функция cut вырезала не только по горизонтали, а и по вертикали.

class Window(QMainWindow):
    buffered_text = ''
    current_text = ''
    count = 1
    text_after = ''
    text_before = ''
    text_copy = ''
    isSaved = False

    def __init__(self):
        super().__init__()

        self.top = 150
        self.left = 150
        self.height = 600
        self.width = 1200
        self.default = 'Simple'
        self.title = f'{self.default}-Notebook'

        self.init_ui()
        self.init_window_1()
        self.show()

    def init_ui(self):
        msgBox = QMessageBox
        self.textbox = QTextEdit()
        self.textbox.setFocusPolicy(Qt.StrongFocus)
        self.textbox.setFont(QFont('Times', 18))
        self.textbox.selectionChanged.connect(self.handleSelectionChanged)
        self.cursor = self.textbox.textCursor()


        bar = self.menuBar()
        file_menu = bar.addMenu('File')

        create_action = QAction('Create', self)
        create_action.setShortcut('CTRL+N')
        open_action = QAction('Open...', self)
        open_action.setShortcut('CTRL+O')
        save_action = QAction('Save', self)
        save_action.setShortcut('CTRL+S')
        save_as_action = QAction('Save as...', self)
        save_as_action.setShortcut('CTRL+SHIFT+S')
        close_action = QAction('Close', self)

        file_menu.addAction(create_action)
        file_menu.addAction(open_action)
        file_menu.addAction(save_action)
        file_menu.addAction(save_as_action)
        file_menu.addSeparator()
        file_menu.addAction(close_action)

        create_action.triggered.connect(self.create)
        open_action.triggered.connect(self.open)
        save_action.triggered.connect(self.save)
        save_as_action.triggered.connect(self.save_as)
        close_action.triggered.connect(self.close_app)

        file_edit = bar.addMenu('Edit')

        cancel_action = QAction('Cancel', self)
        cancel_action.setShortcut('CTRL+Z')
        cut_action = QAction('Cut', self)
        cut_action.setShortcut('CTRL+X')
        copy_action = QAction('Copy', self)
        copy_action.setShortcut('CTRL+C')
        paste_action = QAction('Paste', self)
        paste_action.setShortcut('CTRL+V')
        delete_action = QAction('Delete', self)
        delete_action.setShortcut('DELETE')

        file_edit.addAction(cancel_action)
        file_edit.addSeparator()
        file_edit.addAction(cut_action)
        file_edit.addAction(copy_action)
        file_edit.addAction(paste_action)
        file_edit.addAction(delete_action)

        cancel_action.triggered.connect(self.cancel)
        cut_action.triggered.connect(self.cut)
        copy_action.triggered.connect(self.copy)
        paste_action.triggered.connect(self.paste)
        delete_action.triggered.connect(self.delete)

        self.setCentralWidget(self.textbox)

    def init_window_1(self):
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setWindowTitle(self.title)
        self.setWindowIcon(QIcon('../Icon/Windows_Notepad_Icon.png'))

    def handleSelectionChanged(self):
        text = self.textbox.textCursor().selectedText()
        return text

    def cancel(self):
        print(self.buffered_text)
        print(self.current_text)
        self.current_text = self.textbox.toPlainText()
        self.textbox.setText(self.buffered_text)
        self.cursor.setPosition(len(self.buffered_text), QTextCursor.KeepAnchor)
        self.textbox.setTextCursor(self.cursor)
        self.buffered_text = self.current_text

    def cut(self):
        text = self.handleSelectionChanged()
        self.current_text = self.textbox.toPlainText()
        print(type(self.current_text))
        self.buffered_text = self.current_text
        if text in self.current_text:
            new_text = self.current_text.replace(text, '')
            self.textbox.setText(new_text)
            self.cursor.setPosition(len(new_text), QTextCursor.KeepAnchor)
            self.textbox.setTextCursor(self.cursor)

    def copy(self):
        self.text_copy = self.textbox.toPlainText()

    def paste(self):
        self.textbox.setText(self.text_copy)

    def delete(self):
        self.cut()

    def save_as(self):
        file_name, _ = QFileDialog.getSaveFileName(self, 'Save', '*.txt', "Текстовые документы (*.txt);;"
                                                                          "All Files()")
        if file_name:
            with open(file_name, 'w+') as file:
                file.write(self.textbox.toPlainText())

    def save(self):
        self.text_before = self.textbox.toPlainText()
        if self.text_before:
            if self.text_before != self.text_after:
                self.save_as()
                self.isSaved = True
                self.text_after = self.text_before

    def open(self):
        file_name, file_extension = QFileDialog.getOpenFileName(self, 'Open file...', 'C://Program Files/')
        if file_name:
            with open(file_name, 'r') as file:
                self.textbox.setText(file.read())

    def create(self):
        text = self.textbox.toPlainText()
        if text:
            change = QMessageBox.question(self, 'Notebook', 'Do you want to save the changes to a file?',
                                          QMessageBox.Save | QMessageBox.No | QMessageBox.Cancel)
            if change == QMessageBox.Save:
                self.save_as()
            elif change == QMessageBox.No:
                self.textbox.clear()

    def close_app(self):
        text = self.textbox.toPlainText()
        if text:
            if not self.isSaved:
                change = QMessageBox.question(self, 'Notebook', 'Do you want to save the changes to a file?',
                                              QMessageBox.Save | QMessageBox.No | QMessageBox.Cancel)
                if change == QMessageBox.Save:
                    self.save_as()
                elif change == QMessageBox.No:
                    sys.exit()
                else:
                    return True

    def closeEvent(self, event):
        if self.close_app():
            event.ignore()
        else:
            self.close_app()

Ответы (1 шт):

Автор решения: S. Nick

Я подправил ваш метод

...
def handleSelectionChanged(self):
    text = self.textbox.textCursor().selectedText()
    print(f'  --->>>  text=`{text}`')              # обратите внимание на вывод

    text = '\n'.join(text.split())                                # <<<-------<

    return text
...

Попробуйте:

import sys
from PyQt5.Qt import *
from PyQt5 import QtWidgets, QtGui, QtCore


class Window(QMainWindow):
    buffered_text = ''
    current_text = ''
    count = 1
    text_after = ''
    text_before = ''
    text_copy = ''
    isSaved = False

    def __init__(self):
        super().__init__()
        self.top = 150
        self.left = 150
        self.height = 600
        self.width = 1200
        self.default = 'Simple'
        self.title = f'{self.default}-Notebook'
        self.init_ui()
        self.init_window_1()
        self.show()

    def init_ui(self):
        msgBox = QMessageBox
        self.textbox = QTextEdit()
        self.textbox.setFocusPolicy(Qt.StrongFocus)
        self.textbox.setFont(QFont('Times', 18))
        self.textbox.selectionChanged.connect(self.handleSelectionChanged)
        self.cursor = self.textbox.textCursor()
        bar = self.menuBar()
        file_menu = bar.addMenu('File')
        create_action = QAction('Create', self)
        create_action.setShortcut('CTRL+N')
        open_action = QAction('Open...', self)
        open_action.setShortcut('CTRL+O')
        save_action = QAction('Save', self)
        save_action.setShortcut('CTRL+S')
        save_as_action = QAction('Save as...', self)
        save_as_action.setShortcut('CTRL+SHIFT+S')
        close_action = QAction('Close', self)

        file_menu.addAction(create_action)
        file_menu.addAction(open_action)
        file_menu.addAction(save_action)
        file_menu.addAction(save_as_action)
        file_menu.addSeparator()
        file_menu.addAction(close_action)

        create_action.triggered.connect(self.create)
        open_action.triggered.connect(self.open)
        save_action.triggered.connect(self.save)
        save_as_action.triggered.connect(self.save_as)
        close_action.triggered.connect(self.close_app)

        file_edit = bar.addMenu('Edit')

        cancel_action = QAction('Cancel', self)
        cancel_action.setShortcut('CTRL+Z')
        cut_action = QAction('Cut', self)
        cut_action.setShortcut('CTRL+X')
        copy_action = QAction('Copy', self)
        copy_action.setShortcut('CTRL+C')
        paste_action = QAction('Paste', self)
        paste_action.setShortcut('CTRL+V')
        delete_action = QAction('Delete', self)
        delete_action.setShortcut('DELETE')

        file_edit.addAction(cancel_action)
        file_edit.addSeparator()
        file_edit.addAction(cut_action)
        file_edit.addAction(copy_action)
        file_edit.addAction(paste_action)
        file_edit.addAction(delete_action)

        cancel_action.triggered.connect(self.cancel)
        cut_action.triggered.connect(self.cut)
        copy_action.triggered.connect(self.copy)
        paste_action.triggered.connect(self.paste)
        delete_action.triggered.connect(self.delete)

        self.setCentralWidget(self.textbox)

    def init_window_1(self):
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setWindowTitle(self.title)
        self.setWindowIcon(QIcon('../Icon/Windows_Notepad_Icon.png'))

    def handleSelectionChanged(self):
        text = self.textbox.textCursor().selectedText()
        print(f'  --->>>  text=`{text}`')              # обратите внимание на вывод

        text = '\n'.join(text.split())                                # <<<-------<

        return text

    def cancel(self):
        print(self.buffered_text)
        print(self.current_text)
        self.current_text = self.textbox.toPlainText()
        self.textbox.setText(self.buffered_text)
        self.cursor.setPosition(len(self.buffered_text), QTextCursor.KeepAnchor)
        self.textbox.setTextCursor(self.cursor)
        self.buffered_text = self.current_text

    def cut(self):
        text = self.handleSelectionChanged()
        self.current_text = self.textbox.toPlainText()
        #print(type(self.current_text))
        print(f'current_text = \n`{self.current_text}`\n')
        self.buffered_text = self.current_text
        if text in self.current_text:
            new_text = self.current_text.replace(text, '')
            self.textbox.setText(new_text)
            self.cursor.setPosition(len(new_text), QTextCursor.KeepAnchor)
            self.textbox.setTextCursor(self.cursor)

    def copy(self):
        self.text_copy = self.textbox.toPlainText()

    def paste(self):
        self.textbox.setText(self.text_copy)

    def delete(self):
        self.cut()

    def save_as(self):
        file_name, _ = QFileDialog.getSaveFileName(self, 'Save', '*.txt', "Текстовые документы (*.txt);;"
                                                                          "All Files()")
        if file_name:
            with open(file_name, 'w+') as file:
                file.write(self.textbox.toPlainText())

    def save(self):
        self.text_before = self.textbox.toPlainText()
        if self.text_before:
            if self.text_before != self.text_after:
                self.save_as()
                self.isSaved = True
                self.text_after = self.text_before

    def open(self):
        file_name, file_extension = QFileDialog.getOpenFileName(self, 'Open file...', 'C://Program Files/')
        if file_name:
            with open(file_name, 'r') as file:
                self.textbox.setText(file.read())

    def create(self):
        text = self.textbox.toPlainText()
        if text:
            change = QMessageBox.question(self, 'Notebook', 'Do you want to save the changes to a file?',
                                          QMessageBox.Save | QMessageBox.No | QMessageBox.Cancel)
            if change == QMessageBox.Save:
                self.save_as()
            elif change == QMessageBox.No:
                self.textbox.clear()

    def close_app(self):
        text = self.textbox.toPlainText()
        if text:
            if not self.isSaved:
                change = QMessageBox.question(self, 'Notebook', 'Do you want to save the changes to a file?',
                                              QMessageBox.Save | QMessageBox.No | QMessageBox.Cancel)
                if change == QMessageBox.Save:
                    self.save_as()
                elif change == QMessageBox.No:
                    sys.exit()
                else:
                    return True

    def closeEvent(self, event):
        if self.close_app():
            event.ignore()
        else:
            self.close_app()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w  = Window()
    w.resize(300, 200)
    w.show()
    app.exec_()             

введите сюда описание изображения

→ Ссылка