如何防止 QTabWidget 滚动按钮获得焦点?

Posted

技术标签:

【中文标题】如何防止 QTabWidget 滚动按钮获得焦点?【英文标题】:How to prevent QTabWidget scroll buttons from gaining focus? 【发布时间】:2017-12-26 18:49:03 【问题描述】:

在下面的代码中,红色背景会随着每次 Tab 键的按下来回跳跃。添加更多标签(对我来说大约八个)会导致标签栏滚动按钮出现,并导致需要按两次标签键的情况。

有什么方法可以防止滚动按钮获得键盘焦点?

# Testing with python 3.6.3 pip installed pyqt5 5.9.2 in virtualenv on Ubuntu
import sys
from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        layout = QtWidgets.QVBoxLayout()
        self.setLayout(layout)

        self.tabs_left = QtWidgets.QTabWidget()
        self.tabs_left.setFocusPolicy(QtCore.Qt.NoFocus)
        self._add_tab(self.tabs_left)
        self.tabs_right = QtWidgets.QTabWidget()
        self.tabs_right.setFocusPolicy(QtCore.Qt.NoFocus)
        self._add_tab(self.tabs_right)

        layout.addWidget(self.tabs_left)
        layout.addWidget(self.tabs_right)

        self.add_button = QtWidgets.QPushButton('Add Tab')
        self.add_button.setFocusPolicy(QtCore.Qt.NoFocus)
        layout.addWidget(self.add_button)

        self.add_button.clicked.connect(self._add_tab_left)

    def _add_tab(self, tabs):
        edit = QtWidgets.QTextEdit()
        edit.setReadOnly(True)
        edit.setStyleSheet("QTextEdit:focus  background-color: red;")
        tabs.addTab(edit, ''.format(tabs.count()))

    def _add_tab_left(self):
        self._add_tab(self.tabs_left)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

您可以通过在选项卡工具按钮上设置焦点策略来解决此问题:

class Widget(QtWidgets.QWidget):
    ...
    def _add_tab(self, tabs):
        ...
        for child in tabs.findChildren(QtWidgets.QToolButton):
            child.setFocusPolicy(QtCore.Qt.NoFocus)

【讨论】:

以上是关于如何防止 QTabWidget 滚动按钮获得焦点?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 CWnd 获得焦点?

如何防止 QTabWidget 中的选项卡按钮缩小

有没有办法防止 ScrollView 在 TextView 获得焦点时自动滚动?

防止焦点 div 使用箭头键滚动

当表格在IE中获得焦点时表格滚动条跳起来

ScrollView中的Horizo​​ntal RecyclerView:垂直滚动时如何获得焦点?