Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 10, 2017 20:20:07

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 Контекстное меню

У меня возникло ряд вопросов по контекстному меню.
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)

Прикреплённый файлы:
attachment вопрос.png (54,1 KБ)

Офлайн

#2 Сен. 10, 2017 21:45:22

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQT5 Контекстное меню

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
Иначе:
  лелаем то что делаось бы и так...



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Сен. 10, 2017 23:03:52

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 Контекстное меню

Урезала все лишнее, оставила только для примера.

 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 и колесико мыши одновременно

Если не затруднит

Офлайн

#4 Сен. 10, 2017 23:53:48

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PyQT5 Контекстное меню

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

Офлайн

#5 Сен. 11, 2017 00:20:33

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT5 Контекстное меню

Вик57, огромное спасибо за мышку! вот только не понять почему кнопками не срабатывает shortcut=QKeySequence.ZoomIn

Офлайн

#6 Сен. 11, 2017 01:21:22

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PyQT5 Контекстное меню

а в системе определено?
через меню у меня работает
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)

Прикреплённый файлы:
attachment scr.png (53,2 KБ)

Офлайн

#7 Сен. 11, 2017 13:22:19

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQT5 Контекстное меню

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)



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 11, 2017 13:23:29)

Офлайн

#8 Сен. 11, 2017 14:50:25

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PyQT5 Контекстное меню

PEHDOM
QShortcut(QKeySequence(“Ctrl++”), self, self.zoomIn)
это для цифровой клавиатуры , на ноутах ее нет и код клавиши другой соотв.

Офлайн

#9 Сен. 11, 2017 15:05:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

PyQT5 Контекстное меню

vic57
это для цифровой клавиатуры , на ноутах ее нет и код клавиши другой соотв.
ХЗ, у меня работает на простых клавишах + и - которые между нулем и бекспейсом на основной клавиатуре. Учитывая что + получаеться только с шифтом, то приходиться нажимать ctrl+shift++ и всеравно работает..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 11, 2017 15:07:28)

Офлайн

#10 Сен. 11, 2017 15:22:20

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

PyQT5 Контекстное меню

PEHDOM

QShortcut(QKeySequence(“Ctrl++”), self, self.zoomIn)
QShortcut(QKeySequence(“Ctrl+-”), self, self.zoomOut)
кстати да, этот способ сработал

Отредактировано vic57 (Сен. 11, 2017 15:31:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version