【问题标题】:PyQt: tab order not working for a simple custom widgetPyQt:标签顺序不适用于简单的自定义小部件
【发布时间】: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 这是一个错误。
  • 是的,我自己刚刚发现了那个错误报告。谢谢。

标签: python qt pyqt


【解决方案1】:

好的,这似乎是一个相当长期的 Qt 错误,其中 setTabOrder() 无法正确处理具有焦点代理的小部件。 https://bugreports.qt.io/browse/QTBUG-10907中的错误报告

最简单的解决方法(至少对于上述情况):明确地将焦点代理放在标签顺序链上,如下所示: self.setTabOrder(self.sp1.focusProxy(), self.sp3.focusProxy())

【讨论】:

    【解决方案2】:

    只需在Designer 应用程序中将标签属性focusPolicy 设置为NoFocus 或在设置ui 方法self.[tab object name].setFocusPolicy(QtCore.Qt.NoFocus) 中添加以下代码即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2010-12-09
      • 2013-04-15
      • 2012-06-03
      相关资源
      最近更新 更多