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
- 我想用键盘把注意力集中在结果上
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)