Форум сайта python.su
У меня возникло ряд вопросов по контекстному меню.
1) Как сделать не активными некоторые пункты в меню, как это есть в стандарте, и как потом их задействовать
2) Пункт “Збільшити” и “Зменшити” не реагируют на клавиши, хотя другие кнопки реагируют верно
3) Как сделать увеличение текста и уменьшение не только с помощью контекстного меню, но и роликом мыши, например как в браузере (Ctrl+колесико)
текст:
class WinTextEdit(QTextEdit): def __init__(self, widget, parent=None, **kwargs): super(WinTextEdit, self).__init__(parent, **kwargs) self.widget=widget def closewidget(self): self.widget.close() def contextMenuEvent(self, event): menu = QMenu() menu.addSeparator() menu.addAction('Скасувати',self.undo,shortcut=QKeySequence.Undo) menu.addAction('Повторити',self.redo,shortcut=QKeySequence.Redo) menu.addSeparator() menu.addAction('Збільшити',self.zoomIn,shortcut=QKeySequence.ZoomIn) menu.addAction('Зменьшити',self.zoomOut, shortcut=QKeySequence.ZoomOut) menu.addSeparator() menu.addAction('Вирізати',self.cut,shortcut=QKeySequence.Cut) menu.addAction('Скопіювати',self.copy,shortcut=QKeySequence.Copy) menu.addAction('Вставити',self.paste,shortcut=QKeySequence.Paste) menu.addSeparator() menu.addAction('Вибрати все',self.selectAll, shortcut=QKeySequence.SelectAll) menu.addSeparator() menu.addAction('Закрити',self.closewidget,shortcut='Ctrl+Q') menu.exec_(event.globalPos())
Отредактировано lubocka (Сен. 10, 2017 20:20:35)
Прикреплённый файлы: вопрос.png (54,1 KБ)
Офлайн
lubockaкаждый пункт меню это обьект QAction, соотвевенно у каждого QAction есть свойство enabled и метод setEnabled(bool)/setDisabled(bool) котороые устанавливают это свойство. Если у элемента меню QAction свойство enabled == False то он будет неактивен, если True(по умолчанию) - активно. Устанавливая свойство enabled для каждого єлемента вы можете делать его активным или неактивным.
Как сделать не активными некоторые пункты в меню, как это есть в стандарте, и как потом их задействовать
lubockaневозможно сказать исходя из того куска который вы выложили. Выложите кусок котороый можно запустить и проверить, котороый повторяет ошибку.
2) Пункт “Збільшити” и “Зменшити” не реагируют на клавиши, хотя другие кнопки реагируют верно
lubockaпереопределить wheelEvent() примерно так
3) Как сделать увеличение текста и уменьшение не только с помощью контекстного меню, но и роликом мыши, например как в браузере (Ctrl+колесико)
def wheelEvent(self,event): Если нажато ctrl: делаем ZoomIn или ZoomOut Иначе: лелаем то что делаось бы и так...
[code python][/code]
Офлайн
Урезала все лишнее, оставила только для примера.
import sys from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QHBoxLayout from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QKeySequence from PyQt5.QtWidgets import QMenu from PyQt5.QtWidgets import QTextEdit class WinTextEdit(QTextEdit): def __init__(self, widget, parent=None, **kwargs): super(WinTextEdit, self).__init__(parent, **kwargs) self.widget=widget def contextMenuEvent(self, event): menu = QMenu() menu.addSeparator() menu.addAction('Скасувати',self.undo,shortcut=QKeySequence.Undo) menu.addAction('Повторити',self.redo,shortcut=QKeySequence.Redo) menu.addSeparator() menu.addAction('Збільшити',self.zoomIn,shortcut=QKeySequence.ZoomIn) menu.addAction('Зменьшити',self.zoomOut, shortcut=QKeySequence.ZoomOut) menu.exec_(event.globalPos()) class Notepad(QWidget): def __init__(self): super().__init__() self.text = WinTextEdit(self) self.initNotepad() self.show() def initNotepad(self): self.setWindowTitle("Редактор тексту") boxH = QHBoxLayout() boxH.addWidget(self.text) self.setLayout(boxH) def textclear(self): self.text.clear() self.text.setFocus() if __name__ == '__main__': app = QApplication(sys.argv) appWin = Notepad() sys.exit(app.exec())
Офлайн
import sys from PyQt5.Qt import * class TextEdit(QTextEdit): def __init__(self,parent=None): super(TextEdit, self).__init__(parent) def contextMenuEvent(self, event): menu = QMenu() menu.addSeparator() menu.addAction('Скасувати',self.undo,shortcut=QKeySequence.Undo) menu.addAction('Повторити',self.redo,shortcut=QKeySequence.Redo) menu.addSeparator() menu.addAction('Збільшити',self.zoomIn,shortcut=QKeySequence.ZoomIn) menu.addAction('Зменьшити',self.zoomOut,shortcut=QKeySequence.ZoomOut) menu.exec_(event.globalPos()) def wheelEvent(self,e): if e.modifiers() == Qt.AltModifier: #Alt + wheel delta = e.angleDelta().y() #print(delta) if delta > 0: self.zoomIn() elif delta < 0: self.zoomOut() e.accept() if __name__ == "__main__": app = QApplication(sys.argv) w = TextEdit() w.move(0,0) w.show() sys.exit(app.exec_())
Офлайн
Вик57, огромное спасибо за мышку! вот только не понять почему кнопками не срабатывает shortcut=QKeySequence.ZoomIn
Офлайн
а в системе определено?
через меню у меня работает
upd: через клавиатуру тоже не работает, сделал через eventFilter (лениво разбираться в глюках)
import sys from PyQt5.Qt import * class TextEdit(QTextEdit): def __init__(self,parent=None): super(TextEdit, self).__init__(parent) self.setObjectName('text_edit') qApp.installEventFilter(self) def contextMenuEvent(self, event): menu = QMenu() menu.addSeparator() menu.addAction('Скасувати',self.undo,shortcut=QKeySequence.Undo) menu.addAction('Повторити',self.redo,shortcut=QKeySequence.Redo) menu.addSeparator() menu.addAction('Збільшити',self.zoomIn,shortcut=QKeySequence.ZoomIn) menu.addAction('Зменьшити',self.zoomOut,shortcut=QKeySequence.ZoomOut) menu.exec_(event.globalPos()) def wheelEvent(self,e): if e.modifiers() == Qt.AltModifier: #Alt + wheel delta = e.angleDelta().y() #print(delta) if delta > 0: self.zoomIn() elif delta < 0: self.zoomOut() e.accept() def eventFilter(self,obj,e): if obj.objectName() == 'text_edit': if e.type() == QEvent.KeyPress: if e.modifiers() == Qt.ControlModifier: #print(e.key()) if e.key() == 61: self.zoomIn() #Ctrl + Plus elif e.key() == 45: self.zoomOut() #Ctrl + Minus return QTextEdit.eventFilter(self,obj,e) if __name__ == "__main__": app = QApplication(sys.argv) w = TextEdit() w.move(0,0) w.show() sys.exit(app.exec_())
Отредактировано vic57 (Сен. 11, 2017 02:55:28)
Прикреплённый файлы: scr.png (53,2 KБ)
Офлайн
vic57Не уверен что должно работать.
upd: через клавиатуру тоже не работает, сделал через eventFilter (лениво разбираться в глюках)
from PyQt5.QtWidgets import QShortcut ..... class WinTextEdit(QTextEdit): def __init__(self, widget, parent=None, **kwargs): ....... QShortcut(QKeySequence("Ctrl++"), self, self.zoomIn) QShortcut(QKeySequence("Ctrl+-"), self, self.zoomOut)
[code python][/code]
Отредактировано PEHDOM (Сен. 11, 2017 13:23:29)
Офлайн
PEHDOMэто для цифровой клавиатуры , на ноутах ее нет и код клавиши другой соотв.
QShortcut(QKeySequence(“Ctrl++”), self, self.zoomIn)
Офлайн
vic57ХЗ, у меня работает на простых клавишах + и - которые между нулем и бекспейсом на основной клавиатуре. Учитывая что + получаеться только с шифтом, то приходиться нажимать ctrl+shift++ и всеравно работает..
это для цифровой клавиатуры , на ноутах ее нет и код клавиши другой соотв.
[code python][/code]
Отредактировано PEHDOM (Сен. 11, 2017 15:07:28)
Офлайн
PEHDOM
QShortcut(QKeySequence(“Ctrl++”), self, self.zoomIn)кстати да, этот способ сработал
QShortcut(QKeySequence(“Ctrl+-”), self, self.zoomOut)
Отредактировано vic57 (Сен. 11, 2017 15:31:03)
Офлайн