用例:我有一个QListWidget
。当用户选择任何行时,我想将当前项和选择重置为第3行:
from PyQt5.QtWidgets import QApplication, QListWidget
app = QApplication([])
l = QListWidget()
l.setSelectionMode(QListWidget.SingleSelection)
l.addItems(list('abcde'))
def slot(current, previous):
# sm = l.selectionModel()
l.blockSignals(True)
l.setCurrentRow(3)
l.blockSignals(False)
# sm.select(l.currentIndex(), sm.Select) # Does not work
# sm.setCurrentIndex(l.currentIndex(), sm.Select) # Does not work
l.currentItemChanged.connect(slot)
l.show()
app.exec()
上面的示例将第三行设置为当前行,但将所选行保留为用户单击的行。我已经尝试了QItemModel.select()
和QItemModel.setCurrentIndex()
的各种组合以及类似的东西,但都没有效果。我在Google和Qt论坛上也没有找到答案。你知道吗
在本例中使用blockSignals是一把双刃剑,因为我认为您使用它是为了避免无限循环。但是这也不会产生模型被更新的情况,而且它是不必要的,因为
setCurrentRow()
只会在它与以前的值不同的情况下更新,从而避免了这个问题。你知道吗解决方案是使用
QTimer.singleShot()
来更新更改:注:如果
currentRowChanged
信号更改为currentItemChanged
,则逻辑不会更改。你知道吗相关问题 更多 >
编程相关推荐