Найти - Пользователи
Полная версия: PyQT5 Контекстное меню
Начало » Python для новичков » PyQT5 Контекстное меню
1
lubocka
У меня возникло ряд вопросов по контекстному меню.
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())
PEHDOM
lubocka
Как сделать не активными некоторые пункты в меню, как это есть в стандарте, и как потом их задействовать
каждый пункт меню это обьект QAction, соотвевенно у каждого QAction есть свойство enabled и метод setEnabled(bool)/setDisabled(bool) котороые устанавливают это свойство. Если у элемента меню QAction свойство enabled == False то он будет неактивен, если True(по умолчанию) - активно. Устанавливая свойство enabled для каждого єлемента вы можете делать его активным или неактивным.

lubocka
2) Пункт “Збільшити” и “Зменшити” не реагируют на клавиши, хотя другие кнопки реагируют верно
невозможно сказать исходя из того куска который вы выложили. Выложите кусок котороый можно запустить и проверить, котороый повторяет ошибку.
lubocka
3) Как сделать увеличение текста и уменьшение не только с помощью контекстного меню, но и роликом мыши, например как в браузере (Ctrl+колесико)
переопределить wheelEvent() примерно так
псевдокод:
 def wheelEvent(self,event):
Если нажато ctrl:
   делаем ZoomIn или ZoomOut
Иначе:
  лелаем то что делаось бы и так...
lubocka
Урезала все лишнее, оставила только для примера.
 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())
Если Вас не затруднит, опишите более об def wheelEvent(self,event):
а именно как перехватить и нажатый Ctrl и колесико мыши одновременно

Если не затруднит
vic57
 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_())
lubocka
Вик57, огромное спасибо за мышку! вот только не понять почему кнопками не срабатывает shortcut=QKeySequence.ZoomIn
vic57
а в системе определено?
через меню у меня работает
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_())


PEHDOM
vic57
upd: через клавиатуру тоже не работает, сделал через eventFilter (лениво разбираться в глюках)
Не уверен что должно работать.
То что работает копи/паст/андо/редо это заслуга QTextEdit-а, где эти шоткаты прописаны по умолчанию.
А то что вы lubocka прописываетет в menu во первых не будет работать потому что меню вы создаетет исключительно в contextMenuEvent как локальную переменную, а во вторых, шоткаты прописаные в menu.addAction или QAction.setShortcut всеравно нихрена почемуто не работают, даже если выставлять QAction.setShortcutContext(QtCore.Qt.ApplicationShortcut). Возможно это работает только для главного меню, ХЗ.
Можно выйти из ситуации как предложил vic57 через евентфильтр, а можно просто добавить шоткакт через QShortcut
 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)
vic57
PEHDOM
QShortcut(QKeySequence(“Ctrl++”), self, self.zoomIn)
это для цифровой клавиатуры , на ноутах ее нет и код клавиши другой соотв.
PEHDOM
vic57
это для цифровой клавиатуры , на ноутах ее нет и код клавиши другой соотв.
ХЗ, у меня работает на простых клавишах + и - которые между нулем и бекспейсом на основной клавиатуре. Учитывая что + получаеться только с шифтом, то приходиться нажимать ctrl+shift++ и всеравно работает..
vic57
PEHDOM
QShortcut(QKeySequence(“Ctrl++”), self, self.zoomIn)
QShortcut(QKeySequence(“Ctrl+-”), self, self.zoomOut)
кстати да, этот способ сработал

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB