今天我制作的文件树界面有两个控件。一曰QLineEdit,二曰QTreeView。
在QTreeView中设置了一个Enter(Return)快捷键,用来打开文件。有关TreeView的代码示意如下:
class MyTreeView(QTreeView)
def __init__(self)
......(前面代码省略)
self.rename_shortcut = QShortcut(QKeySequence('F2'), self)
self.copy_shortcut = QShortcut(QKeySequence.Copy, self)
self.paste_shortcut = QShortcut(QKeySequence.Paste, self)
self.delete_shortcut = QShortcut(QKeySequence('Delete'), self)
self.open_shortcut = QShortcut(QKeySequence('Return'), self)
self.open_shortcut.setContext(Qt.WidgetShortcut)
self.goto_parent_path_shortcut = QShortcut(QKeySequence('Backspace'), self)
效果如图:
可见上面有个QLineEdit。
结果发现问题:QLineEdit的returnPressed信号不管用了!
解决问题。
查阅资料发现,这可能是设置TreeView的快捷键遇到的问题。
查找文档发现,TreeView的默认Value=1,亦即WindowShortCut。意思就是说,当这个快捷键的父控件——也就是Treeview——的父控件被激活时,快捷键将生效。
换句话说,由于这里的TreeView和LineEdit是同级控件,所以当LineEdit被选中的时候,TreeView的快捷键就会被激活。这样的话,LineEdit的回车键就被拦截了!
由此,使用调用QShortcut.setContext,值为Qt.WidgetShortcut即可。这样只有TreeView获得焦点的时候,快捷键才会生效。
参考下表。如需要中文翻译,请看这个帖子:
中文翻译:QShortcut