PyQt:Tab键顺序不适用于简单的自定义小部件

时间:2016-03-17 09:15:49

标签: python qt pyqt

我制作了一个自定义小部件,其中包含一个旋转框和一个复选框。小部件使用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()

2 个答案:

答案 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)