Python 停止焦点在QTableView中陷入陷阱

Python 停止焦点在QTableView中陷入陷阱,python,pyqt5,focus,qtableview,Python,Pyqt5,Focus,Qtableview,MRE: 按原样,焦点选项卡可以很好地穿过组件 但是,当您取消注释以添加QTableView时,将选项卡插入此组件意味着您无法再次进行选项卡。我尝试了Shift Tab(在反向循环方向上的选项卡,但仍在表格单元格中),并尝试了Ctrl Tab/Ctrl Shift Tab(似乎移动了当前单元格) 我对使用Tab在这些单元格中导航一点也不感兴趣(箭头导航键做同样的事情),只是希望这种“圈套”不会发生,这样我就可以像以前一样,以循环方式在所有组件中进行Tab/Shift Tab操作 我尝试了一些方法

MRE:

按原样,焦点选项卡可以很好地穿过组件

但是,当您取消注释以添加
QTableView
时,将选项卡插入此组件意味着您无法再次进行选项卡。我尝试了Shift Tab(在反向循环方向上的选项卡,但仍在表格单元格中),并尝试了Ctrl Tab/Ctrl Shift Tab(似乎移动了当前单元格)

我对使用Tab在这些单元格中导航一点也不感兴趣(箭头导航键做同样的事情),只是希望这种“圈套”不会发生,这样我就可以像以前一样,以循环方式在所有组件中进行Tab/Shift Tab操作

我尝试了一些方法,将这些行添加到
MyWindow的末尾

from PyQt5.QtCore import QRect, Qt, QAbstractTableModel
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QWidget, QVBoxLayout, QLineEdit, QListWidget
import sys, types

class MyTableModel( QAbstractTableModel ):
    def __init__( self ):
        super(MyTableModel, self).__init__()
        data = [
              [4, 9, 2],
              [1, 0, 0],
              [3, 5, 0],
        ]
        self._data = data

    def data(self, index, role):
        if role == Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def rowCount(self, index):
        return len(self._data)

    def columnCount(self, index):
        return len(self._data[0])

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.resize(600, 700 )
        self.centralwidget = QWidget(MainWindow)
        self.verticalLayoutWidget = QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry( QRect(20, 20, 500, 500))
        self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget)
        self.comps = []
        
        self.title_line_edit = QLineEdit(self.verticalLayoutWidget)
        self.comps.append( self.title_line_edit )
        self.verticalLayout.addWidget(self.title_line_edit)

        self.tags_list = QListWidget(self.verticalLayoutWidget)
        self.comps.append( self.tags_list )
        self.verticalLayout.addWidget(self.tags_list)
        
        # UNCOMMENT THESE LINES:
#         self.table_view = QTableView(self.verticalLayoutWidget)
#         self.comps.append( self.table_view )
#         self.table_view.setGeometry(QRect(20, 20, 200, 200))
#         self.verticalLayout.addWidget(self.table_view)
#         self.table_view.setModel( MyTableModel() )

        self.title_line_edit2 = QLineEdit(self.verticalLayoutWidget)
        self.comps.append( self.title_line_edit2 )
        self.verticalLayout.addWidget(self.title_line_edit2)
        
        MainWindow.setCentralWidget(self.centralwidget)

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        def focus_in_event( self, event ):
            self.original_stylesheet = self.styleSheet()
            self.setStyleSheet( 'border:1px solid rgb(0, 255, 0);' )
        def focus_out_event( self, event ):
            self.setStyleSheet( self.original_stylesheet )
        for comp in self.ui.comps:
            comp.focusInEvent = types.MethodType( focus_in_event, comp )
            comp.focusOutEvent = types.MethodType( focus_out_event, comp )

app = QApplication(sys.argv)
application = MyWindow()
application.show()
sys.exit(app.exec())
    # seemingly no effect:
    def focus_next_prev_child( self, next ):
        return False
    self.ui.table_view.focusNextPrevChild = types.MethodType( focus_next_prev_child, comp )
    # just omits the table view from the focus cycle:
    self.ui.table_view.setFocusPolicy( Qt.NoFocus )
我还尝试拦截到达表视图的击键(同样,将这些行添加到
MyWindow中)

from PyQt5.QtCore import QRect, Qt, QAbstractTableModel
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QWidget, QVBoxLayout, QLineEdit, QListWidget
import sys, types

class MyTableModel( QAbstractTableModel ):
    def __init__( self ):
        super(MyTableModel, self).__init__()
        data = [
              [4, 9, 2],
              [1, 0, 0],
              [3, 5, 0],
        ]
        self._data = data

    def data(self, index, role):
        if role == Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def rowCount(self, index):
        return len(self._data)

    def columnCount(self, index):
        return len(self._data[0])

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.resize(600, 700 )
        self.centralwidget = QWidget(MainWindow)
        self.verticalLayoutWidget = QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry( QRect(20, 20, 500, 500))
        self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget)
        self.comps = []
        
        self.title_line_edit = QLineEdit(self.verticalLayoutWidget)
        self.comps.append( self.title_line_edit )
        self.verticalLayout.addWidget(self.title_line_edit)

        self.tags_list = QListWidget(self.verticalLayoutWidget)
        self.comps.append( self.tags_list )
        self.verticalLayout.addWidget(self.tags_list)
        
        # UNCOMMENT THESE LINES:
#         self.table_view = QTableView(self.verticalLayoutWidget)
#         self.comps.append( self.table_view )
#         self.table_view.setGeometry(QRect(20, 20, 200, 200))
#         self.verticalLayout.addWidget(self.table_view)
#         self.table_view.setModel( MyTableModel() )

        self.title_line_edit2 = QLineEdit(self.verticalLayoutWidget)
        self.comps.append( self.title_line_edit2 )
        self.verticalLayout.addWidget(self.title_line_edit2)
        
        MainWindow.setCentralWidget(self.centralwidget)

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        def focus_in_event( self, event ):
            self.original_stylesheet = self.styleSheet()
            self.setStyleSheet( 'border:1px solid rgb(0, 255, 0);' )
        def focus_out_event( self, event ):
            self.setStyleSheet( self.original_stylesheet )
        for comp in self.ui.comps:
            comp.focusInEvent = types.MethodType( focus_in_event, comp )
            comp.focusOutEvent = types.MethodType( focus_out_event, comp )

app = QApplication(sys.argv)
application = MyWindow()
application.show()
sys.exit(app.exec())
    # seemingly no effect:
    def focus_next_prev_child( self, next ):
        return False
    self.ui.table_view.focusNextPrevChild = types.MethodType( focus_next_prev_child, comp )
    # just omits the table view from the focus cycle:
    self.ui.table_view.setFocusPolicy( Qt.NoFocus )

这确实拦截了Tab和Shift Tab,并阻止了默认操作,但我不知道如何在焦点循环中找到正确的组件。而且这看起来像是一个敲开螺母的大锤:想必有一种更优雅的方式来获得我想要的行为…

如果你根本不想通过单元格进行Tab,请添加
self.table\vview.setTabKeyNavigation(错误)