如何解决折叠QToolButton下QListWidget搜索匹配项高亮后无法自动滚动到顶部问题
问题原因
你遇到的问题核心是布局更新的时序问题:
当QToolButton处于折叠状态时,你调用on_pressed展开容器后,Qt的布局系统不会立即完成content_area和内部QListWidget的尺寸重算、渲染工作,此时立刻执行scrollToItem,QListWidget还处于不可见/尺寸为0的状态,滚动逻辑无法正确计算目标位置,因此滚动失效。第二次按下回车时容器已经完成展开布局,滚动逻辑就能正常执行。
解决方案
只需要在执行滚动操作前,让Qt先处理完所有待执行的布局事件,或者将滚动操作延迟到布局更新完成后执行即可。这里提供两种可行实现:
方案1:直接处理待执行事件
调用QApplication.processEvents()处理所有队列中的布局、渲染事件,修改find_selected方法如下:
def find_selected(self): user_text = self.find_text_box.text() if user_text in collapsed_list: if not self.box.toggle_button.isChecked(): self.box.on_pressed() self.box.toggle_button.setChecked(True) # 新增:处理所有待执行的布局、渲染事件 QApplication.processEvents() item = self.qlist.findItems(user_text, QtCore.Qt.MatchRegExp)[0] item.setSelected(True) self.qlist.scrollToItem(item, QAbstractItemView.PositionAtTop)
方案2:延迟执行滚动逻辑
如果担心processEvents会处理多余的无关事件,也可以用单次定时器将滚动操作延迟到布局更新完成后执行:
def find_selected(self): user_text = self.find_text_box.text() def do_scroll(): item = self.qlist.findItems(user_text, QtCore.Qt.MatchRegExp)[0] item.setSelected(True) self.qlist.scrollToItem(item, QAbstractItemView.PositionAtTop) if user_text in collapsed_list: if not self.box.toggle_button.isChecked(): self.box.on_pressed() self.box.toggle_button.setChecked(True) # 延迟1ms执行滚动,等待布局更新完成 QtCore.QTimer.singleShot(1, do_scroll) else: do_scroll()
两种方案都可以解决折叠状态下需要按两次回车才能滚动到目标条目的问题,直接替换原代码中的find_selected方法即可生效。
内容的提问来源于stack exchange,提问作者Abhinav Saini
相关产品推荐
相关产品推荐

