根据鼠标所在位置获取组件拿到 “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

相关推荐
阿里嘎多学长6 分钟前
2025-12-21 GitHub 热点项目精选
开发语言·程序员·github·代码托管
wanghowie12 分钟前
01.04 Java基础篇|泛型、注解与反射实战
java·开发语言·windows
水煎包V:YEDIYYDS88814 分钟前
QT QML 实现的旋钮按钮,类似收音机音量旋钮,可指示方向和角度
qt·qml·旋钮组件
DechinPhy15 分钟前
使用Python免费合并PDF文件
开发语言·数据库·python·mysql·pdf
qq_2526144119 分钟前
python爬虫爬取视频
开发语言·爬虫·python
言之。20 分钟前
Claude Code Skills 实用使用手册
java·开发语言
龚建波21 分钟前
Qt程序设计:QPromise/QFuture多线程任务管理
qt·qfuturewatcher·qpromise·qfuture
追烽少年x21 分钟前
Qt面试题合集(三)
qt
Rinai_R24 分钟前
关于 Go 的内存管理这档事
java·开发语言·golang
咸鱼加辣25 分钟前
【python面试】你x的启动?
开发语言·python