使用QTableView类时,如何检测鼠标光标离开视口?

2024-09-20 07:44:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我找到了QAbstractItemView类的'viewportEntered'信号,它是QTableView类的超类。如果我使用这个信号来做一个动作,我还需要一种方法来在鼠标光标离开视口时撤消这个动作。你知道吗


Tags: 方法信号鼠标动作光标视口qtableviewqabstractitemview
1条回答
网友
1楼 · 发布于 2024-09-20 07:44:00

有必要跟踪所示要求在什么时刻得到满足,然后发出新的信号:

from PyQt5 import QtCore, QtGui, QtWidgets

class TableView(QtWidgets.QTableView):
    viewportLeaved = QtCore.pyqtSignal()

    def __init__(self, *args, **kwargs):
        super(TableView, self).__init__(*args, **kwargs)
        self.is_entered = False
        self.setMouseTracking(True)
        self.viewportEntered.connect(self.on_viewportEntered)

    def on_viewportEntered(self):
        self.is_entered = True

    def viewportEvent(self, event):
        res = super(TableView, self).viewportEvent(event)
        if event.type() == QtCore.QEvent.Leave:
            if self.is_entered:
                self.viewportLeaved.emit()
                self.is_entered = False
        return res

    def mouseMoveEvent(self, event):
        super(TableView, self).mouseMoveEvent(event)
        if self.indexAt(event.pos()).isValid() and self.is_entered:
            self.viewportLeaved.emit()
            self.is_entered = False

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = TableView()
    w.resize(640, 480)
    model = QtGui.QStandardItemModel(4, 5)
    w.setModel(model)
    w.viewportEntered.connect(lambda: print("viewportEntered", QtCore.QDateTime.currentDateTime().toString()))
    w.viewportLeaved.connect(lambda: print("viewportLeaved", QtCore.QDateTime.currentDateTime().toString()))
    w.show()
    sys.exit(app.exec_())

相关问题 更多 >