Python 当存在隐藏项时,关注下一个QListWidget项

Python 当存在隐藏项时,关注下一个QListWidget项,python,pyqt5,pyside2,Python,Pyqt5,Pyside2,在我谈论我的问题之前,我想谈谈我想做什么 我希望结果和我在QLineEdit中写的单词一起出现在QListWidget中 我想用键盘把注意力集中在结果上 如果我用鼠标点击Qlistwidget并将焦点放在那里,即使有隐藏的项目,我也可以用键盘(上/下箭头键)将焦点放在下一个项目上。系统自动执行此操作,无需编写任何代码 但我希望这样做时不会失去对QLineEdit的关注。所以我决定使用QShortcut: self.\uuuuu-up\u-key=QShortcut(Qt.key\u-up,s

在我谈论我的问题之前,我想谈谈我想做什么

  • 我希望结果和我在
    QLineEdit
    中写的单词一起出现在
    QListWidget
  • 我想用键盘把注意力集中在结果上
如果我用鼠标点击Qlistwidget并将焦点放在那里,即使有隐藏的项目,我也可以用键盘(上/下箭头键)将焦点放在下一个项目上。系统自动执行此操作,无需编写任何代码

但我希望这样做时不会失去对
QLineEdit
的关注。所以我决定使用
QShortcut

self.\uuuuu-up\u-key=QShortcut(Qt.key\u-up,self)
self.\uuuu dw\u key=QShortcut(Qt.key\u Down,self)
self.\u向上\u键。激活。连接(self.\u ctrl)
self.\uuu dw\u键。激活。连接(self.\uu ctrl)
def _ctrl(自):
curr=self.\u list\u widget.currentRow()
如果self.sender().key().toString()=“向上”:
self.\u list\u widget.setCurrentRow(curr-1)
其他:
self.\u list\u widget.setCurrentRow(curr+1)
如果没有隐藏的项目,它会这样工作。但是如果有隐藏项,它们的索引仍然存在,因此即使下一个项被隐藏,它也会选择它。当然我们看不到这一点

我得出这样的结论:

def\uu ctrl(self):
如果self.sender().key().toString()=“向上”:
self.\u list\u widget.setCurrentRow(self.prevVisibleItem())
其他:
self.\u list\u widget.setCurrentRow(self.nextVisibleItem())
def下一个可视项(自身):
对于范围内的行(self.\u list\u widget.currentRow()+1,self.\u list\u widget.count()):
如果不是self.\u list.\u widget.isRowHidden(行):
返回行
返回self.\u list\u widget.currentRow()
def prevVisibleItem(自身):
对于范围内的行(self.\u list\u widget.currentRow()-1,-1,-1):
如果不是self.\u list.\u widget.isRowHidden(行):
返回行
返回self.\u list\u widget.currentRow()
我检查每个项目是否隐藏。这对我来说很有效,但我正在寻找一种更有效的方法。当我关注QListWidget时,我可以在每个项目之间导航,而无需编写任何代码。我想知道这是怎么发生的

最简单的例子:

导入系统 从PyQt5.QtCore导入Qt 从PyQt5.qtwidts导入QApplication、QWidget、QVBoxLayout、QListWidget、QLineEdit、QShortcut 类窗口(QWidget): 定义初始化(自): super()。\uuuu init\uuuuu() self.\u layout=QVBoxLayout() self.entry=QLineEdit() self.entry.setPlaceholderText(“搜索”) self.\u list\u widget=QListWidget() __items=[str(i)+“item”表示范围(6)内的i] self.\u list\u widget.addItems(\u项) __hidden_items=[self.\u list_widget.item(1),self.\u list_widget.item(3),self.\u list_widget.item(5)] 对于i in\u隐藏的\u项: i、 setHidden(真) self.\uuuu up\u key=QShortcut(Qt.key\u up,self) self.\uuuu dw\u key=QShortcut(Qt.key\u Down,self) self.\u向上\u键。激活。连接(self.\u ctrl) self.\uuu dw\u键。激活。连接(self.\uu ctrl) self.\u layout.addWidget(self.entry) self.\u layout.addWidget(self.\u list\u widget) self.setLayout(self.\u布局) self.show() def _ctrl(自): 如果self.sender().key().toString()=“向上”: self.\u list\u widget.setCurrentRow(self.prevVisibleItem()) 其他: self.\u list\u widget.setCurrentRow(self.nextVisibleItem()) def下一个可视项(自身): 对于范围内的行(self.\u list\u widget.currentRow()+1,self.\u list\u widget.count()): 如果不是self.\u list.\u widget.isRowHidden(行): 返回行 返回self.\u list\u widget.currentRow() def prevVisibleItem(自身): 对于范围内的行(self.\u list\u widget.currentRow()-1,-1,-1): 如果不是self.\u list.\u widget.isRowHidden(行): 返回行 返回self.\u list\u widget.currentRow() 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) window=window() sys.exit(app.exec_())
更优雅的解决方案是使用moveCursor获取QModelIndex并将当前索引设置为视图:

def __ctrl(self):
    shorcut = self.sender()
    index = QModelIndex()
    if shorcut.key() == QKeySequence(Qt.Key_Up):
        index = self._list_widget.moveCursor(
            QAbstractItemView.MoveUp, Qt.NoModifier
        )
    elif shorcut.key() == QKeySequence(Qt.Key_Down):
        index = self._list_widget.moveCursor(
            QAbstractItemView.MoveDown, Qt.NoModifier
        )
    if index.isValid():
        self._list_widget.setCurrentIndex(index)