根据鼠标所在位置获取组件拿到 “qt_scrollarea_viewport” 组件的问题

问题起因:

有时候需要鼠标实时所在位置的组件,可以通过如下方法实时获取:

cpp 复制代码
QWidget *current_widget = QApplication::widgetAt(QCursor().pos());
qDebug() << __FUNCTION__ << current_widget;

// 如果是按钮,直接进行转换
QPushButton *btn = qobject_cast<QPushButton*>(current_widget )
if (btn)
{
	// process
}

但是在使用过程中,有一个问题,就是在 QTableView、QTreeView 等 view-model 类型的组件中,是拿不到具体的组件的,通过上述方法,只能拿到 object_name = "qt_scrollarea_viewport" 的组件。

cpp 复制代码
// 比如鼠标所在的位置是一个Button,checkbox等常规组件,那没啥问题

// 但是如果是点击的是QTableView 或 QTreeView 等组件就不行,你点击每个Item,都是同一个object

解决方法

QTableView、QTreeView 等 view-model 类型的组件由于视图和模型的关系,使用QApplication::widgetAt(QCursor().pos()) 拿到的是子组件 qt_scrollarea_viewport,它的父组件(parentWidget)才是当前需要的组件。

cpp 复制代码
QWidget *current_widget = QApplication::widgetAt(QCursor().pos());
qDebug() << __FUNCTION__ << current_widget;

if ("qt_scrollare_viewport" == current_widget->objectName())
{
    QWidget *actual_widget = current_widget->parentWidget();
    qDebug() << __FUNCTION__ << actual_widget;
}

参考:qt-find-actual-widget-underneath-viewport-at-coordinates

相关推荐
迷渡3 小时前
用 Rust 重写的 Bun 有 13365 个 unsafe!
开发语言·后端·rust
吃好睡好便好3 小时前
在Matlab中绘制质点三维运动轨迹图
开发语言·学习·matlab·信息可视化
代码村新手3 小时前
C++-多态
开发语言·c++
雨落在了我的手上3 小时前
初识java(九):类和对象(⼀)
java·开发语言
SilentSamsara4 小时前
泛型与 Protocol:结构化子类型的地道写法
开发语言·python·青少年编程
沐知全栈开发4 小时前
Servlet 表单数据处理指南
开发语言
超梦dasgg4 小时前
详细讲解:WebMvcConfigurer 接口
java·开发语言·spring
阿里嘎多学长4 小时前
2026-05-22 GitHub 热点项目精选
开发语言·程序员·github·代码托管
JAVA社区4 小时前
Java进阶全套教程(三)—— Spring框架核心精讲
java·开发语言·spring·面试·职场和发展·mybatis