对于我的应用程序,我试图将登录控件放到QMenu中,并且很难控制焦点策略。这是我的自定义登录小部件:
class LoginWidget(QWidget):
def __init__(self, parent=None):
super(LoginWidget, self).__init__(parent)
mainLayout = QVBoxLayout()
layoutH = QHBoxLayout()
nameField = QLineEdit()
pwdField = QLineEdit()
pwdField.setEchoMode(QLineEdit.EchoMode(2))
btnSubmit = QPushButton('log in')
btnSubmit.setIcon(IconCache.getIcon('login'))
for w in (nameField, pwdField):
layoutH.addWidget(w)
mainLayout.addLayout(layoutH)
mainLayout.addWidget(btnSubmit)
self.setLayout(mainLayout)然后我将上面的小部件添加到我的菜单中,如下所示:
app = QApplication([])
menu = QMenu()
settingsAction = QAction('settings', menu)
loginAction = QWidgetAction(menu)
loginAction.setDefaultWidget(LoginWidget())
menu.addAction(settingsAction)
menu.addAction(loginAction)
btn = QToolButton()
btn.setText('menu button')
btn.setMenu(menu)
btn.setPopupMode(QToolButton.InstantPopup)
btn.show()
sys.exit(app.exec_())问题是,当您打开菜单时,单击name字段填充用户名,然后按tab键,焦点跳到“设置”操作,而不是LoginWidget中的密码小部件。我尝试了setFocusPolicy(Qt.StrongFocus)在LoginWidget上,以及它的pwdField,但没有结果。
这能办到吗?
提前谢谢你,弗兰克
发布于 2013-12-05 00:09:53
QMenu对Tab / Backtab有特殊的处理,这可以有效地将它们转换为向上/向下键按压。
然而,问题行为的真正来源是focusNextPrevChild方法,它不断将焦点强制返回到菜单。幸运的是,此方法是虚拟的,因此可以在子类中重写它,如下所示:
class Menu(QtGui.QMenu):
def focusNextPrevChild(self, next):
return QtGui.QWidget.focusNextPrevChild(self, next)这将恢复子部件之间的正常选项卡。
要同时启用从子部件到普通菜单项的键盘导航,请确保LoginWidget有一个焦点代理,如下所示:
class LoginWidget(QtGui.QWidget):
def __init__(self, parent=None):
...
self.setFocusPolicy(QtCore.Qt.TabFocus)
self.setFocusProxy(nameField)发布于 2013-12-04 04:32:49
http://qt-project.org/doc/qt-4.8/qwidget.html#setTabOrder
http://qt-project.org/doc/qt-4.8/focus.html#tab-or-shift-tab
制表符或Shift+Tab 按Tab键是使用键盘移动焦点的最常见的方式。(有时,在数据输入应用程序中,Enter与Tab相同;这可以通过实现事件筛选器在Qt中轻松实现。) 按Tab键,在当今所有常用的窗口系统中,将键盘焦点移到每个窗口列表中的下一个窗口部件。选项卡沿着循环列表的一个方向移动焦点,在另一个方向移动Shift+Tab。Tab按下从小部件移动到小部件的顺序称为选项卡顺序。 您可以使用QWidget::setTabOrder()定制选项卡顺序。(如果没有,Tab通常会按小部件构造的顺序移动焦点。)提供了一种可视化更改选项卡顺序的方法。 由于按Tab是很常见的,所以大多数可以有焦点的小部件都应该支持选项卡焦点。主要的例外是很少使用的小部件,以及移动焦点的键盘加速器或错误处理程序。 例如,在数据输入对话框中,可能只有1%的情况下需要字段。在这样的对话框中,Tab可以跳过这个字段,对话框可以使用以下机制之一: 如果程序可以确定是否需要该字段,则可以在用户完成输入并按下OK或用户在完成其他字段后按Enter时将焦点移到那里。或者,将字段包含在选项卡顺序中,但禁用它。如果考虑到用户在其他字段中设置的内容,则启用它。 该字段的标签可以包括将焦点移动到此字段的键盘快捷方式。 Tab支持的另一个例外是必须支持插入制表符的文本条目小部件;几乎所有文本编辑器都属于这个类。Qt将Ctrl+Tab视为Tab,将Ctrl+Shift+Tab视为Shift+Tab,这些小部件可以在调用QWidget::event()之前重新实现QWidget::event()并处理Tab,以获得所有其他键的正常处理。但是,由于一些系统将Ctrl+Tab用于其他目的,而且许多用户都不知道Ctrl+Tab,所以这不是一个完整的解决方案。
因此,您可能希望使用:
QWidget.setTabOrder( nameField, pwdField )
QWidget.setTabOrder( pwdField, btnSubmit )或者类似的东西。
希望这能有所帮助。
https://stackoverflow.com/questions/20365663
复制相似问题