我制作了一个自定义小部件,其中包含一个旋转框和一个复选框。小部件使用setFocusProxy将焦点委托给spinbox。该复选框不应该得到焦点。
我的问题是,当我在布局中使用此窗口小部件时,Qt选项卡顺序无法按预期工作。下面是一个最小的工作示例。在该示例中,当按下Tab键时,焦点应该从Var 1 - > Var 3> Var 2> Var 4移动,但它不会。
如果我用常规的Qt小部件(例如QCheckBoxes)替换CheckSpinBox,它会按预期工作。同样使用复选框作为焦点代理似乎使选项卡顺序正常工作。因此问题似乎是使用spinbox作为焦点代理。
from PyQt4 import QtGui, uic, QtCore
import sys
class CheckSpinBox(QtGui.QWidget):
def __init__(self, parent=None, label=None):
super(self.__class__, self).__init__(parent)
self.degSpinBox = QtGui.QSpinBox()
self.normalCheckBox = QtGui.QCheckBox(label)
layout = QtGui.QHBoxLayout(self)
layout.addWidget(self.degSpinBox)
layout.addWidget(self.normalCheckBox)
self.degSpinBox.setFocusPolicy(QtCore.Qt.StrongFocus)
self.normalCheckBox.setFocusPolicy(QtCore.Qt.NoFocus)
self.setFocusPolicy(QtCore.Qt.StrongFocus)
self.setFocusProxy(self.degSpinBox)
class EntryApp(QtGui.QWidget):
def __init__(self):
super(self.__class__, self).__init__()
layout = QtGui.QGridLayout()
self.sp1 = CheckSpinBox(label='Var 1')
self.sp2 = CheckSpinBox(label='Var 2')
self.sp3 = CheckSpinBox(label='Var 3')
self.sp4 = CheckSpinBox(label='Var 4')
layout.addWidget(self.sp1,1,1)
layout.addWidget(self.sp2,1,2)
layout.addWidget(self.sp3,2,1)
layout.addWidget(self.sp4,2,2)
self.setLayout(layout)
self.setTabOrder(self.sp1, self.sp3)
self.setTabOrder(self.sp3, self.sp2)
self.setTabOrder(self.sp2, self.sp4)
def main():
app = QtGui.QApplication(sys.argv)
eapp = EntryApp()
eapp.show()
app.exec_()
if __name__ == '__main__':
main()
答案 0 :(得分:0)
好吧,这似乎是一个相当长期的Qt错误,其中setTabOrder()无法正确处理具有焦点代理的小部件。 https://bugreports.qt.io/browse/QTBUG-10907
中的错误报告最简单的解决方法(至少在上面的情况下):明确将焦点代理放在Tab键盘链上,如下所示:
self.setTabOrder(self.sp1.focusProxy(), self.sp3.focusProxy())
答案 1 :(得分:0)
只需在focusPolicy
应用程序中将选项卡属性NoFocus
设置为Designer
,或将以下代码添加到设置ui方法self.[tab object name].setFocusPolicy(QtCore.Qt.NoFocus)
。