Vulpine 发表于 2024-4-23 17:21

求教pyqt/pyside大佬关于表格失焦后重置当前行的问题

本帖最后由 Vulpine 于 2024-4-23 17:23 编辑

问题:首先鼠标点击表格选中某一行,鼠标点击其他控件然后鼠标再次滑过表格时,可以看到表格之前选的那一行会被置为未选中状态,用tableWidget.currentRow()时会返回-1
版本:python3.7,pyside6.1.3
诉求:无论如何保持表格当前选项
下面是我自己想到的方法,但是感觉太麻烦了,求教大佬推荐更简单的方法{:1_893:}

思路:点击表格的监听函数中记录当前行,设置全局鼠标移动监听不断设置当前行,防止当前行丢失

# 设置QMainWindow上所有控件的事件过滤器,在事件过滤器中监听所有控件的鼠标移动
    self.installEventFilterRecursively(self)

def installEventFilterRecursively(self, obj):
    """
    递归为所有控件安装事件过滤器和设置鼠标监听
    :param obj:
    :return:
    """
    # 安装事件过滤器
    obj.installEventFilter(self)
    # 设置鼠标监听
    obj.setMouseTracking(True)
    if isinstance(obj, QWidget):# QWidget是所有控件的基类
      for child in obj.findChildren(QWidget):
            self.installEventFilterRecursively(child)

def eventFilter(self, obj, event):
    if event.type() == QEvent.MouseMove:
      self.selectTableWidgetCurrentRow()
    return super().eventFilter(obj, event)

#点击表格的监听函数中记录当前行
self.tableWidget.cellClicked.connect(self.saveCurrentRow)

def saveCurrentRow(self):
    self.tableWidgetRow = self.tableWidget.currentRow()

def selectTableWidgetCurrentRow(self):#设置当前行
    self.tableWidget.selectRow(self.tableWidgetRow)

似水流年2015 发表于 2024-4-23 17:34

能不能设置,当表格失去鼠标焦点时,记录下当前行到某变量,当表格有鼠标滑过时,就把某变量存的行数,设置为选中行

devilpanama 发表于 2024-4-23 17:41

定义个全局变量,每次点击tablewidget时更新,用的时候直接用

Vulpine 发表于 2024-4-23 18:01

似水流年2015 发表于 2024-4-23 17:34
能不能设置,当表格失去鼠标焦点时,记录下当前行到某变量,当表格有鼠标滑过时,就把某变量存的行数,设置 ...

在失焦监听函数中记录的时候当前行有时候就已经被置为未选中状态了。而且这里的失焦我有些分不清,因为当选中表格中的某一行后再去点击其他控件,比如点击按钮,并不会立刻将表格当前行置为未选中状态,而且再当鼠标滑过的时候表格的当前行置就会被设置为未选中状态

Vulpine 发表于 2024-4-23 18:04

devilpanama 发表于 2024-4-23 17:41
定义个全局变量,每次点击tablewidget时更新,用的时候直接用

我现在就是这么搞的,我觉得在qt中是不是有某个属性来控制表格这个特性的,我之前使用swing时没有这问题

chenzhigang 发表于 2024-4-23 18:29

本帖最后由 chenzhigang 于 2024-4-23 18:32 编辑

Vulpine 发表于 2024-4-23 18:01
在失焦监听函数中记录的时候当前行有时候就已经被置为未选中状态了。而且这里的失焦我有些分不清,因为当 ...
你如果点lable 呢 回失去焦点吗

Python_wencai 发表于 2024-4-23 18:43

为啥做这个项目?现在商业有需求吗

Vulpine 发表于 2024-4-23 19:25

chenzhigang 发表于 2024-4-23 18:29
你如果点lable 呢 回失去焦点吗

试了一下不会这样,但是点击按钮也是有时候会有时候不会。很迷茫,不知道什么机制

Vulpine 发表于 2024-4-23 19:26

Python_wencai 发表于 2024-4-23 18:43
为啥做这个项目?现在商业有需求吗

开发一款视觉软件,几个月了

MarioCrane 发表于 2024-4-24 00:17

本帖最后由 MarioCrane 于 2024-4-24 20:56 编辑

我测试了一下,用tableView和tableWidget都无法复现你遇到的问题,点击外部按钮表格会失去焦点,但当前选中行不变,表格重新获取焦点后选中行依旧不变。测试发现tableView和tableWidget有一处不同,tableView通过点击滚动条和点击空白处获取焦点不会改变当前选中行,tableWidget点击空白处则会取消当前选中行。测试环境: Windows 11,Qt 6.6.2 MSVC
页: [1] 2
查看完整版本: 求教pyqt/pyside大佬关于表格失焦后重置当前行的问题