PyQt5 Определите слот в отдельном модуле для QShortcut

Main взаимодействует с графическим интерфейсом, определяемым отдельным модулем. В Main используются два альтернативных подхода для определения слота для QShortcut. Лямбда-метод работает (но кажется громоздким). Прямой метод работает, только если сначала выполняется лямбда-метод. Если строка с лямбда-методом закомментирована, то прямой метод не работает (без сообщения об ошибке). Почему не работает только прямой метод?

'' '# p.py

import sys
from PyQt5 import QtWidgets as qtw
from Q import MainWindow

class MyActions():
    def __init__(self, my_window):
        self.my_window = my_window

        self.my_window.run.activated.connect(lambda: self.rmssg1()) # had to use this as a work-around
        self.my_window.run.activated.connect(self.rmssg2)           # expected this to work

    def rmssg1(self):
        self.my_window.my_label1.setText('Ctrl+R pressed -> mssg 1')

    def rmssg2(self):
        self.my_window.my_label2.setText('Ctrl+R pressed -> mssg 2')

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    mw = MainWindow()
    MyActions(mw)
    mw.show()
    sys.exit(app.exec())

'' 'Вот графический интерфейс в отдельном модуле

'' '#q.py

import sys
from PyQt5 import QtWidgets as qtw
from PyQt5.QtGui import QKeySequence

class MainWindow(qtw.QMainWindow):
    def __init__(self, parent=None):
        super().__init__()

        self.my_label1 = qtw.QLabel("Enter Ctrl+R", self)
        self.my_label1.setGeometry(20,20,200,30)

        self.my_label2 = qtw.QLabel("Enter Ctrl+R", self)
        self.my_label2.setGeometry(20, 50, 200, 30)

        #define shortcut
        self.run = qtw.QShortcut(QKeySequence('Ctrl+R'), self)

'''

1 ответ

Решение

Проблема проста: когда вы делаете MyActions(mw) не назначать переменную объекту, чтобы память могла быть потеряна, решение:

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    mw = MainWindow()
    foo = MyActions(mw)
    mw.show()
    sys.exit(app.exec())
Другие вопросы по тегам