PyQt5中如何显示自定义QLabel并激活对应QShortcut快捷键
问题修复方案
原代码存在3个核心问题导致功能不生效:
- 两个自定义标签组件创建后没有加入主窗口的布局,界面上无法显示
- 组件实例是
__init__方法内的局部变量,方法执行完后会被Python垃圾回收,导致快捷键绑定失效 - 快捷键触发的弹窗内容写死,无法对应不同标签的快捷键提示
修改后完整代码
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import Qt class Create_workingDict(QWidget): def __init__(self, lblname, lblscut): super().__init__() self.lblname = lblname self.lblscut = lblscut lbl_1 = QLabel() lbl_1.setText(self.lblname) lbl_2 = QLabel() lbl_2.setText(f"快捷键:{self.lblscut}") vbox = QVBoxLayout() vbox.addWidget(lbl_1) vbox.addWidget(lbl_2) self.setLayout(vbox) # 绑定快捷键,设置上下文为窗口级快捷键,主窗口激活时即可触发 self.msgSc = QShortcut(QKeySequence(self.lblscut), self) self.msgSc.setContext(Qt.WindowShortcut) self.msgSc.activated.connect(self.show_tip) def show_tip(self): QMessageBox.information(self, '提示', f'已触发【{self.lblname}】功能,绑定快捷键:{self.lblscut}') class Mainclass(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Sample Window") self.resize(300, 200) # 实例化自定义标签,绑定为实例属性避免被回收 self.account_widget = Create_workingDict("Accounts", "Alt+A") self.inventory_widget = Create_workingDict("Inventory", "Ctrl+B") # 给主窗口加布局,把两个自定义标签加进去 main_layout = QVBoxLayout() main_layout.addWidget(self.account_widget) main_layout.addWidget(self.inventory_widget) self.setLayout(main_layout) def main(): app = QApplication(sys.argv) ex = Mainclass() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
关键修改说明
- 主窗口新增垂直布局,将两个自定义标签组件添加到布局中,启动后即可正常显示两个标签的文本内容
- 将自定义标签的实例绑定为
Mainclass的实例属性,避免局部变量生命周期结束后被回收,保证快捷键持续有效 - 把快捷键的触发逻辑抽成单独的类方法,弹窗内容动态读取当前标签的名称和绑定快捷键,不再写死固定提示
- 给快捷键设置
Qt.WindowShortcut上下文,只要主窗口处于激活状态,不管焦点在哪个子组件上,都能正常触发对应快捷键 - 优化了快捷键标签的显示文本,直接展示当前标签绑定的快捷键,交互更清晰
内容的提问来源于stack exchange,提问作者tckraomuqnt
相关产品推荐
相关产品推荐

