Skip to main content
 首页 » 编程设计

python之如何在 pyqt 中捕获鼠标悬停在 QTableWidget 项目上的事件

2025年05月04日10haluo1

我想做的是当我将鼠标悬停在我的 QTableWidget 项目上时更改 QTableWidget 项目的颜色。

请您参考如下方法:

首先,表格小部件需要有 mouse-tracking打开以获取悬停事件。

其次,我们需要找到一些信号,告诉我们鼠标何时进入和离开表格单元格,以便在正确的时间更改背景颜色。

QTableWidget 类有 cellEntered/itemEntered信号,但是当鼠标离开细胞时没有任何信号。因此,我们需要创建一些自定义信号来做到这一点。

下面演示脚本中的 TableWidget 类设置了必要的 cellExited/itemExited 信号,然后展示了如何连接所有东西用鼠标悬停时更改项目背景:

from PyQt4 import QtGui, QtCore 
 
class TableWidget(QtGui.QTableWidget): 
    cellExited = QtCore.pyqtSignal(int, int) 
    itemExited = QtCore.pyqtSignal(QtGui.QTableWidgetItem) 
 
    def __init__(self, rows, columns, parent=None): 
        QtGui.QTableWidget.__init__(self, rows, columns, parent) 
        self._last_index = QtCore.QPersistentModelIndex() 
        self.viewport().installEventFilter(self) 
 
    def eventFilter(self, widget, event): 
        if widget is self.viewport(): 
            index = self._last_index 
            if event.type() == QtCore.QEvent.MouseMove: 
                index = self.indexAt(event.pos()) 
            elif event.type() == QtCore.QEvent.Leave: 
                index = QtCore.QModelIndex() 
            if index != self._last_index: 
                row = self._last_index.row() 
                column = self._last_index.column() 
                item = self.item(row, column) 
                if item is not None: 
                    self.itemExited.emit(item) 
                self.cellExited.emit(row, column) 
                self._last_index = QtCore.QPersistentModelIndex(index) 
        return QtGui.QTableWidget.eventFilter(self, widget, event) 
 
class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
        QtGui.QWidget.__init__(self) 
        self.table = TableWidget(rows, columns, self) 
        for column in range(columns): 
            for row in range(rows): 
                item = QtGui.QTableWidgetItem('Text%d' % row) 
                self.table.setItem(row, column, item) 
        layout = QtGui.QVBoxLayout(self) 
        layout.addWidget(self.table) 
        self.table.setMouseTracking(True) 
        self.table.itemEntered.connect(self.handleItemEntered) 
        self.table.itemExited.connect(self.handleItemExited) 
 
    def handleItemEntered(self, item): 
        item.setBackground(QtGui.QColor('moccasin')) 
 
    def handleItemExited(self, item): 
        item.setBackground(QtGui.QTableWidgetItem().background()) 
 
if __name__ == '__main__': 
 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window(6, 3) 
    window.setGeometry(500, 300, 350, 250) 
    window.show() 
    sys.exit(app.exec_())