PyQt5在单独的模块中为QShortcut

问题描述

Main与单独模块定义的GUI进行交互。 Main中使用了两种替代方法来定义QShortcut的插槽。 lambda方法有效(但看起来很麻烦)。仅当先执行lambda方法时,direct方法才有效。如果使用lambda方法的行被注释掉,则直接方法将失败(无错误消息)。为什么仅直接方法会失败?

''' #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())

''' 这是单独模块中的GUI

''' #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,30)

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

'''

解决方法

问题很简单:当您MyActions(mw)不为该对象分配变量,从而导致内存丢失时,解决方法是:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...