【发布时间】:2016-03-17 09:15:48
【问题描述】:
我制作了一个由旋转框和复选框组成的自定义小部件。小部件使用 setFocusProxy 将焦点委托给微调框。复选框不应获得焦点。
我的问题是,当我在布局中使用此小部件时,Qt 选项卡顺序无法按预期工作。下面是一个最小的工作示例。在示例中,当按下 Tab 键时,焦点应该从 Var 1->Var 3->Var 2->Var 4 移动,但它没有。
如果我用常规 Qt 小部件(例如 QCheckBoxes)替换 CheckSpinBoxes,它会按预期工作。同样使用复选框作为焦点代理似乎可以使标签顺序正常工作。因此,问题似乎在于使用旋转框作为焦点代理。
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()
【问题讨论】:
-
If first or second has a focus proxy, setTabOrder() correctly substitutes the proxy.在QWidget's documentation 中表示。或许与此有关。 -
@Sevanteri 有趣的是,当使用复选框作为焦点代理时,它似乎可以工作。
-
It seems 这是一个错误。
-
是的,我自己刚刚发现了那个错误报告。谢谢。