PyQt5技术问询:QTableView鼠标移入项时在QStatusBar显示数据,移出时隐藏
QTableView鼠标移入移出项时的状态栏显示实现方案
不需要继承QTableView,通过鼠标追踪+事件过滤器结合entered信号就能实现需求,具体步骤如下:
- 开启QTableView的鼠标追踪
默认情况下QTableView仅在鼠标按下时追踪位置,开启后可捕获所有鼠标移动事件:
tableView->setMouseTracking(true);
- 连接
entered信号处理移入逻辑
当鼠标移入有效项时,提取数据并显示到状态栏:
connect(tableView, &QTableView::entered, this, [this](const QModelIndex& index) { if (index.isValid()) { QString itemData = index.data(Qt::DisplayRole).toString(); statusBar()->showMessage(itemData); } });
- 安装事件过滤器处理移出场景
通过事件过滤器监听两种移出情况:鼠标完全离开表格、鼠标在表格内但移到项之外的空白区域:
bool YourMainWindow::eventFilter(QObject* watched, QEvent* event) { if (watched == tableView) { if (event->type() == QEvent::Leave) { // 鼠标移出表格,清空状态栏 statusBar()->clearMessage(); } else if (event->type() == QEvent::MouseMove) { QMouseEvent* mouseEvt = static_cast<QMouseEvent*>(event); QModelIndex currentIndex = tableView->indexAt(mouseEvt->pos()); if (!currentIndex.isValid()) { // 鼠标在表格内但未指向任何项,清空状态栏 statusBar()->clearMessage(); } } } return QMainWindow::eventFilter(watched, event); }
记得在构造函数中给tableView安装过滤器:
tableView->installEventFilter(this);
说明
这种方案无需自定义QTableView子类,通过Qt的事件机制即可完整覆盖所有场景:
- 鼠标移入有效项:触发
entered信号显示数据 - 鼠标移出项到表格空白区:通过
MouseMove事件检测无效索引,清空状态栏 - 鼠标完全离开表格:通过
Leave事件清空状态栏
内容的提问来源于stack exchange,提问作者Lisen
相关产品推荐
相关产品推荐

