Как сделать чтобы выделенный текст в 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_()
